Eu tenho um código parecido com este abaixo:
Class A {
public boolean myMethod(someargs) {
MyQueryClass query = new MyQueryClass();
Long id = query.getNextId();
// some more code
}
}
Class MyQueryClass {
....
public Long getNextId() {
//lot of DB code, execute some DB query
return id;
}
}
Agora estou escrevendo um teste para A.myMethod(someargs)
. Quero pular o método real query.getNextId()
e, em vez disso, retornar um valor de stub. Basicamente, eu quero zombar MyQueryClass
.
Então, em meu caso de teste, usei:
MyQueryClass query = PowerMockito.mock(MyQueryClass.class);
PowerMockito.whenNew(MyQueryClass.class).withNoArguments().thenReturn(query);
when(query.getNextId()).thenReturn(1000000L);
boolean b = A.getInstance().myMethod(args);
//asserts
Eu usei @RunWith(PowerMockRunner.class)
e @PrepareForTest({MyQueryClass.class})
no início da minha aula de teste.
Mas quando eu depuro o teste, ele ainda está chamando o método real getNextId()
da MyQueryClass
classe.
O que estou perdendo aqui? Alguém pode ajudar porque sou novo no Mockito e no PowerMockito.
Como @TrueDub mencionou em sua resposta aceita, você precisa adicionar a classe onde o construtor é chamado ao
@PrepareForTest
.No entanto, se você fizer isso, a cobertura para essa classe, conforme relatado por eclemma e Sonar, será zero para essa classe
Wiki Powermockito
Portanto, a solução aqui seria refatorar o código real para usar uma fábrica estática que retornaria uma instância dessa classe e então simularia estaticamente.
fonte
Talvez você possa simplesmente usar
fonte