Mockito:Java - 是否可以更改InjectMocks类中使用的变量值?

时间:2016-06-10 14:40:41

标签: java unit-testing mocking mockito junit4

我想知道这是否可行。我尝试了一些使用@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://....";

   ...
}

这可能吗?如果是这样,如果不怎么样?我不能成为唯一一个想到这一点的人,但我找不到任何文件。

1 个答案:

答案 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;
    }



   ...
}