Mockito:Java - 是否可以更改 InjectMocks class 中使用的变量值?
Mockito: Java - Is it possible to Change a variable value used in an InjectMocks class?
我想知道这是否可能。我尝试了一些使用 @mock 和 @spy 的实现来创建一个新字符串,该字符串与 injectMocked class 中的变量名称相同,但是我收到以下错误:
Cannot mock/spy class java.lang.String
Mockito cannot mock/spy following:
- final classes
- anonymous classes
- primitive types
在 InjectMocked 中使用的 class 我有:
public class Service{
String url = getUrl();
...
}
但是我想使用不同的 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();
}
所以当测试 运行s 时 class 是这样的:
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");
}
...
}
我想知道这是否可能。我尝试了一些使用 @mock 和 @spy 的实现来创建一个新字符串,该字符串与 injectMocked class 中的变量名称相同,但是我收到以下错误:
Cannot mock/spy class java.lang.String
Mockito cannot mock/spy following:
- final classes
- anonymous classes
- primitive types
在 InjectMocked 中使用的 class 我有:
public class Service{
String url = getUrl();
...
}
但是我想使用不同的 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();
}
所以当测试 运行s 时 class 是这样的:
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");
}
...
}