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");

    }
    ...
}