Estou usando Spring 3.1.4.RELEASE e Mockito 1.9.5. Na minha aula de primavera eu tenho:
@Value("#{myProps['default.url']}")
private String defaultUrl;
@Value("#{myProps['default.password']}")
private String defaultrPassword;
// ...
Do meu teste JUnit, que atualmente configurei assim:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:test-context.xml" })
public class MyTest
{
Eu gostaria de simular um valor para meu campo "defaultUrl". Observe que não quero simular valores para os outros campos - gostaria de mantê-los como estão, apenas o campo "defaultUrl". Observe também que não tenho métodos "setter" explícitos (por exemplo setDefaultUrl
) em minha classe e não quero criar nenhum apenas para fins de teste.
Diante disso, como posso simular um valor para aquele campo?
ReflectionTestUtils.setField(bean, "fieldName", "value");
antes de invocar seubean
método durante o teste.Agora foi a terceira vez que eu pesquisei este post do SO, já que sempre esqueço como simular um campo @Value. Embora a resposta aceita esteja correta, sempre preciso de algum tempo para fazer a chamada "setField" certa, então, pelo menos para mim, colo um snippet de exemplo aqui:
Aula de produção:
Classe de teste:
fonte
Você também pode simular a configuração de sua propriedade em sua classe de teste
fonte
Eu gostaria de sugerir uma solução relacionada, que é passar os
@Value
campos anotados como parâmetros para o construtor, em vez de usar aReflectionTestUtils
classe.Em vez disso:
e
Faça isso:
e
Benefícios dessa abordagem: 1) podemos instanciar a classe Foo sem um contêiner de dependência (é apenas um construtor) e 2) não estamos acoplando nosso teste aos detalhes de implementação (a reflexão nos liga ao nome do campo usando uma string, o que pode causar um problema se alterarmos o nome do campo).
fonte
Você pode usar esta anotação mágica do Spring Test:
consulte org.springframework.test.context.TestPropertySource
Por exemplo, esta é a classe de teste:
E esta é a classe com a propriedade:
fonte
Usei o código abaixo e funcionou para mim:
Referência: https://www.jeejava.com/mock-an-autowired-value-field-in-spring-with-junit-mockito/
fonte
Uma maneira de resolver isso é mudar sua classe para usar Injeção de Construtor , que é usada para teste e injeção de Spring. Sem mais reflexão :)
Portanto, você pode passar qualquer String usando o construtor:
E em seu teste, basta usá-lo:
fonte