MOCKITO:为什么私人变量不在模拟类中加载


public class Manager {
    private static url = SomeService.get();
    public void method() {
        ....
    }
}
@RunWith(MockitoJUnitRunner.class)
public class ManagerTest {
    @InjectMocks
    Manager manager = new Manager();
    @Test
    public void testMethod(){
         manager.method();
    }
}

当我尝试注入Manager类时,我发现静态变量url为空,并且在testMethod()中未初始化。有人让我知道我在哪里做错了吗?

在Mockito中,@InjectMocks不做任何魔术。如果您没有自己实例化,则简单地实例化了带注释的系统按测试(SUT),并致电相应的设置器将模拟物注入SUT。

返回您的代码,摩根托无法跳入更改private static final SomeUrl url = SomeService.get();的行为。这只是您的真正SomeService.get()是返回null

肯定有一些方法可以将其解决(使用PowerMock或其他模仿Lib(例如Jmockit等))。这里最大的问题是您的代码不容易测试。尝试进行一些重构:

  1. 在这种情况下避免使用static
  2. 避免在SUT内部创建依赖关系(您需要模拟)。应注入依赖项。

,您的代码看起来像

public class Manager {
    private SomeUrl url;
    public void setUrl(SomeUrl url) { this.url = url; }
    public void method() {
        doSomethingOnUrl(this.url.getUrlString());
    }
}
@RunWith(MockitoJUnitRunner.class)
public class ManagerTest {
    @InjectMocks
    Manager manager = new Manager();
    @Mock
    SomeUrl mockUrl;   // <- This is the mock that will be injected by Mockito
    @Test
    public void testMethod(){
         // Given
         when(mockUrl.getUrlString()).thenReturn("SomeUrl");
         // When
         manager.method();
         // Then
         verify(mockUrl, times(1)).getUrlString();
    }
}

是的,这是正确的。由于模拟是动态代理,而URL是类在类中定义的静态变量。大多数模拟用于模拟预期行为(方法),因此,如果您想返回一些自己喜欢的URL,则可以在Geturl方法返回您喜欢的URL时使用。在您的情况下,您可以返回someService.get()

相关内容

  • 没有找到相关文章

最新更新