我想知道这是否可能。我尝试了一些使用@mock和@spy的实现来创建一个与injectMocked类中的变量名称相同的新字符串,但是我收到以下错误:
Cannot mock/spy class java.lang.String
Mockito cannot mock/spy following:
- final classes
- anonymous classes
- primitive types
在 InjectMocked 中使用的类中,我有:
public class Service{
String url = getUrl();
...
}
但是,我想使用不同的网址进行测试,因为我们有一个用于测试环境的网址。
我尝试过以下方法:
@Mock
private String url = "myUrlString";
@Spy
private String url = "myUrlString";
我想要的是,当我运行测试时,url 的新值将被注入(inject)到 inJectMock 中,并将使用而不是另一个值。
示例:
@RunWith(MockitoJUnitRunner.class)
public class ServiceTest{
@Mock // or similar
private String url = "http://....";
@InjectMocks
private Service service = new Service();
}
所以当测试运行时,类是这样的:
public class Service{
// Uses the inject url instead of the method that it originally uses
String url = "http://....";
...
}
这可能吗?如果是的话怎么会,如果不是的话又是怎么来的?我不是唯一一个想到这样做的人,但是我找不到任何相关文档。
最佳答案
您应该只使用测试值设置 url,例如 service.setUrl(testUrl);
。 Mockito 的目的并不是为变量提供模拟值,而是为您不想在单元测试中运行的方法提供模拟实现。
例如,如果您有这样的类(class):
public class UrlProvider {
public String getUrl(){
return "http://real.url";
}
}
并且您在服务中使用它:
public class Service{
UrlProvider provider;
public Service(UrlProvider provider){
this.provider = provider;
}
...
}
然后你就可以轻松更改getUrl方法的返回值:
@RunWith(MockitoJUnitRunner.class)
public class ServiceTest{
@Mock
private UrlProvider urlProvider;
@InjectMocks
private Service service = new Service();
@Before
public void init(){
when(urlProvider.getUrl()).thenReturn("http://test.url");
}
...
}
关于java - Mockito:Java - 是否可以更改 InjectMocks 类中使用的变量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751013/