Metodo when do mockito retornando objeto null [RESOLVIDO]

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.

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 @MockBeans 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.