Como posso simular uma variável de campo que está sendo inicializada inline?
class Test {
private Person person = new Person();
...
public void testMethod() {
person.someMethod();
...
}
}
Aqui, eu quero simular person.someMethod()
enquanto testo o Test.testMethod()
método para o qual preciso simular a inicialização da person
variável. Qualquer pista?
Editar: não tenho permissão para modificar a classe Person.
java
mockito
junit4
powermockito
Uma corrida
fonte
fonte
Person
. As opções incluem adicionar um construtor para fazer isso ou adicionar um método setter.Respostas:
O Mockito vem com uma classe auxiliar para economizar um pouco de reflexão sobre o código da placa padrão:
Atualização: Infelizmente, a equipe do mockito decidiu remover a classe no Mockito 2. Então você está de volta a escrever seu próprio código padrão de reflexão, usar outra biblioteca (por exemplo, Apache Commons Lang ) ou simplesmente roubar a classe Whitebox (é licenciada pelo MIT ).
Atualização 2: JUnit 5 vem com suas próprias classes ReflectionSupport e AnnotationSupport que podem ser úteis e evitar que você obtenha outra biblioteca.
fonte
internal
pacote e parece não funcionar mais no Mockito 2.6.2.Bem tarde para a festa, mas fui atingido aqui e recebi a ajuda de um amigo. O problema era não usar PowerMock. Isso funciona com a versão mais recente do Mockito.
Mockito vem com isso
org.mockito.internal.util.reflection.FieldSetter
.O que ele basicamente faz é ajudá-lo a modificar campos privados usando reflexão.
É assim que você o usa:
Dessa forma, você pode passar um objeto simulado e verificá-lo posteriormente.
Aqui está a referência.
fonte
FieldSetter
não está mais disponível em Mockito 2.x.Class#getDeclaredField
aceita um único parâmetro, portanto, os parênteses precisam ter a seguinte aparênciaFieldSetter.setField(underTest, underTest.getClass().getDeclaredField("person"), mockedPerson);
. Foi assim que entendi errado e pensei que seria uma boa ideia consertar no seu exemplo. Obrigado por responder.Caso você use Spring Test, experimente org.springframework.test.util.ReflectionTestUtils
fonte
testImplementation("org.springframework:spring-test:5.1.2.RELEASE")
Já encontrei a solução para este problema que esqueci de postar aqui.
Os pontos principais para esta solução são:
Executando meus casos de teste com PowerMockRunner:
@RunWith(PowerMockRunner.class)
Instrua Powermock para se preparar
Test.class
para a manipulação de campos privados:@PrepareForTest({ Test.class })
E, finalmente, simule o construtor da classe Person:
PowerMockito.mockStatic(Person.class);
PowerMockito.whenNew(Person.class).withNoArguments().thenReturn(person);
fonte
mockStatic
função, mas isso não é representado em seu exemplo de código. O exemplo de código deve ter amockStatic
chamada ou isso não é necessário para os construtores?O código a seguir pode ser usado para inicializar o mapeador na simulação do cliente REST. O
mapper
campo é privado e precisa ser definido durante a configuração do teste de unidade.fonte
Usando o guia de @ Jarda, você pode definir isso se precisar definir a variável com o mesmo valor para todos os testes:
Mas tome cuidado, pois a definição de valores privados diferentes deve ser tratada com cuidado. Se eles forem privados, por algum motivo.
Exemplo, eu uso, por exemplo, para alterar o tempo de espera de um sono nos testes de unidade. Em exemplos reais, quero dormir por 10 segundos, mas no teste de unidade fico satisfeito se for imediato. Em testes de integração, você deve testar o valor real.
fonte