我想知道这是否可能。我已经尝试了一些使用 @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();
...
}
但是,我想使用不同的 url 进行测试,因为我们有一个用于测试环境的 url。
我尝试过以下方法:
@Mock
private String url = "myUrlString";
@Spy
private String url = "myUrlString";
我想要的是当我运行测试时,url 的新值将被注入到 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 不是为了提供变量的模拟值,而是提供你不想在单元测试中运行的方法的模拟实现。
例如,如果你有一个这样的类:
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");
}
...
}