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



我想知道这是否可能。我已经尝试了一些使用 @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");
    }
    ...
}

相关内容

  • 没有找到相关文章

最新更新