Olá pessoal tudo bem? fui escalado para realizar teste unitários no meu emprego de programação, porem estou o dia inteiro quebrando a cabeça com esse problema:
Possuo um Controller
public class GenericValuesResource {
private final GenericValuesService genericValuesService;
@GetMapping("/{type}")
private DeferredResult<ResponseEntity<?>> getAll(Pageable pageable, @PathVariable("type") String type) {
final DeferredResult<ResponseEntity<?>> dr = new DeferredResult<>();
dr.setResult(ResponseEntity.ok(this.genericValuesService.findAll(pageable, type)));
return dr;
}
}
Possuo tambem uma service que foi mockada. ela possui metodos protected que não coloquei aqui.
public class GenericValuesService {
private final GenericValuesRepository genericValuesRepository;
private final MonesIntegrationService monesIntegrationService;
private final WorkspaceRepository workspaceRepository;
public Page<GenericValues> findAll(Pageable pageable, String type) {
GenericValuesType genericValue = null;
try {
genericValue = GenericValuesType.valueOf(type);
} catch (Exception e) {
throw new GenericValuesException(type);
}
this.updateValuesFromMones(genericValue);
return this.genericValuesRepository.findByWorkspaceAndType(User.currentUser().getWorkspace(), genericValue, pageable);
}
no meu teste eu mockei a classe e mockei o comportamento esperado do metodo.
@RunWith(MockitoJUnitRunner.class)
class GenericValuesResourceTest {
@MockBean
private GenericValuesService genericValuesService;
@Autowired
private GenericValuesResource genericValuesResource;
@BeforeEach
public void setup(){
RestAssuredMockMvc.standaloneSetup(this.genericValuesResource);
}
@Test
void getAll() {
Page<GenericValues> page = Mockito.mock(Page.class);
Pageable pageable = Mockito.mock(Pageable.class);
Mockito.when(this.genericValuesService.findAll(pageable,"title")).thenReturn(page);
}
}
Porem apresenta este erro
java.lang.NullPointerException: Cannot invoke “xxx.service.GenericValuesService.findAll(org.springframework.data.domain.Pageable, String)” because “this.genericValuesService” is null
Alguem consegue me auxiliar,?
Vc sabe a versão do junit está usando? se a versão 4 ou 5.
Então, em vez de:
@RunWith(MockitoJUnitRunner.class)
deve ser
@ExtendWith(SpringExtension.class)
-
@RunWith
é usado com JUnit4, enquanto @ExtendWith
é uma nova mecanica introduzida no JUnit5.
-
E o StringExtension
vai fazer os @MockBean
s funcionarem
Faça essas mudanças e veja se funciona.
Ainda não funcionou, pelo o que eu entendi, o mock do objeto não está funcionando, tentei mockar todos os metodos e mesmo assim não deu certo, tem alguma anotação especifica?
Como ficou o código alterado? Posta ele ai pra gente ver.
O codigo ficou assim, fiz algumas alterações ontem porque tentei resolver com um colega aqui do trabalho.
@ExtendWith(SpringExtension.class)
class GenericValuesResourceTest {
@MockBean
private GenericValuesRepository genericValuesRepository;
@MockBean
private MonesIntegrationService monesIntegrationService;
@MockBean
private WorkspaceRepository workspaceRepository;
private GenericValuesService genericValuesService;
@BeforeEach
public void setup() { }
@Test
void getAll() {
genericValuesService = new GenericValuesService(genericValuesRepository,monesIntegrationService, workspaceRepository);
List<GenericValues> array = new ArrayList<GenericValues>();
List<ContactGroupValueResponse> array1 = new ArrayList<ContactGroupValueResponse>();
Pageable page = Pageable.unpaged();
Page<GenericValues> page1 = Page.empty();
Workspace workspace = mock(Workspace.class);
when(genericValuesRepository.findByWorkspaceAndType(workspace, GenericValuesType.TITLE, Pageable.unpaged()))
.thenReturn(page1);
when(monesIntegrationService.getContactGroupValuesBy(GenericValuesType.TITLE))
.thenReturn(array1);
when(monesIntegrationService.getContactGroupValuesBy(any(Long.class)))
.thenReturn(array1);
genericValuesService.findAll(page, "TITLE");
Mockito.verify(monesIntegrationService, Mockito.times(1)).getContactGroupValuesBy(any(GenericValuesType.class));
}
}
o erro que está ocorrendo agora é este
java.lang.NullPointerException: Cannot invoke "org.springframework.web.context.request.RequestAttributes.getAttribute(String, int)" because the return value of "org.springframework.web.context.request.RequestContextHolder.getRequestAttributes()" is null
Parece que o código que está sendo testado talvez esteja está acessando algo da request, porém o teste é apenas unitário e não sobe a aplicação para que a camada web esteja disponível.
Acertou, você acabou de salvar um programador Jr.
Massa! Mas qual componente que q estava causando o problema? Só para ficar mais clara a solução.