我想知道这是否可行。我尝试了一些使用@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进行测试,因为我们有一个测试环境。
我尝试了以下内容:
@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://....";
...
}
这可能吗?如果是这样,如果不怎么样?我不能成为唯一一个想到这一点的人,但我找不到任何文件。
答案 0 :(得分:2)
您应该只使用您的测试值设置网址,例如import org.joda.time.*;
import org.joda.time.format.*;
public class Test {
public static void main(String[] args) {
String text = "2016-06-01T14:46:22.001Z";
DateTime dt = ISODateTimeFormat.dateTime()
.withZone(DateTimeZone.UTC)
.parseDateTime(text);
System.out.println(dt);
}
}
。 Mockito不是为变量提供模拟值,而是提供您不希望在单元测试中运行的方法的模拟实现。
例如,如果您有这样的类:
service.setUrl(testUrl);
您在服务中使用它:
public class UrlProvider {
public String getUrl(){
return "http://real.url";
}
}
然后您可以轻松更改getUrl方法的返回值:
public class Service{
UrlProvider provider;
public Service(UrlProvider provider){
this.provider = provider;
}
...
}