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

标签 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();

   ...
}

但是,我想使用不同的网址进行测试,因为我们有一个用于测试环境的网址。

我尝试过以下方法:

@Mock
private String url = "myUrlString";

@Spy
private String url = "myUrlString";

我想要的是,当我运行测试时,url 的新值将被注入(inject)到 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 的目的并不是为变量提供模拟值,而是为您不想在单元测试中运行的方法提供模拟实现。

例如,如果您有这样的类(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");

    }
    ...
}

关于java - Mockito:Java - 是否可以更改 InjectMocks 类中使用的变量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751013/

相关文章:

java - 由于 javascript 回调,Selenium 未选择选择选项

java - Arrays.asList 的返回类型是什么?

scala - 测试 Play Controller 时模拟 ActionBuilder 的服务

c# - Moq - 检查具体类的方法调用

java - 如何断言抛出异常后尚未调用方法?

具有并行支持的 C# 模拟框架

Java 类/文件名驱动程序

java - Spring 依赖项没有被注入(inject)到 BeforeSuite 方法中?

jsf - 如何在实际 Web 应用程序之外使用 ViewMap 模拟 JSF FacesContext 以进行单元测试?

java - 何时在小程序中使用 AccessController.doPrivileged()?