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等))。这里最大的问题是您的代码不容易测试。尝试进行一些重构:
- 在这种情况下避免使用
static
。 - 避免在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()