由于构造函数中的 Static class,Mockito 无法使用 @InjectMocks 创建实例
Mockito is unable to create instance using @InjectMocks because of Static class in constructor
我必须对一些代码(不是我写的)进行单元测试,但我被困在一个地方。
我正在使用 Powermock 和 mockito。
所以问题是 @InjectMocks 在测试方法之前调用默认构造函数,在默认构造函数内部,他们使用静态 class 和 setter 来设置字段,因此使用 @Inject 注入模拟是无法创建实例。有没有办法通过更改 API 代码来解决这个问题?
RunWith(PowerMockRunner.class)
@PrepareForTest(UserGroup.class)
public class SomeServiceImplTest {
@Mock
private SomeDAOImpl SomeDAOImpl;
@Mock
private UserGroup userGroup;
@InjectMocks
SomeServiceImpl someServiceImpl;
@Test
public void testSomeMethod(){
String username = "UserToBeTest";
//Some code
//
verify(SomeDAOImpl).saveUserGroup(any(),any());
}
}
public class SomeServiceImpl {
private SomeDAOImpl someDAOImpl;
private SomeIndex someIndex;
public void setSomeDAOImpl(SomeDAOImpl someDAOImpl) {
this.someDAOImpl = someDAOImpl;
}
public SomeServiceImpl (){
someIndex; = AFinalClass.init();
setSomeDAOImpl(new SomeDAOImpl())
}
}
我想阻止 SomeServiceImpl() 被调用。如果有任何方法可以解决此问题,请告诉我。
我可以模拟构造函数吗 - 但是 SomeServiceImpl() 在 testSomeMethod() 之前被调用。
围绕静态方法调用的正常解决方案是引入工厂。
而不是
public class Example {
private void foo() {
Instant now = Instant.now();
}
}
使用
public class Example {
private final Supplier<Instant> instantSupplier;
public Example(Supplier<Instant> instantSupplier) {
this.instantSupplier = instantSupplier;
}
public void foo() {
Instant now = instantSupplier.get();
System.out.println(now);
}
}
现在您可以模拟 Instant 的创建。
@RunWith(MockitoJUnitRunner.class)
public class ExampleTest {
@Mock
Supplier<Instant> instantSupplier;
@Test
public void test() {
Instant myNow = Instant.parse("2007-12-03T10:15:30.00Z");
when(instantSupplier.get()).thenReturn(myNow);
new Example(instantSupplier).foo();
}
}
输出:
2007-12-03T10:15:30Z
我必须对一些代码(不是我写的)进行单元测试,但我被困在一个地方。 我正在使用 Powermock 和 mockito。 所以问题是 @InjectMocks 在测试方法之前调用默认构造函数,在默认构造函数内部,他们使用静态 class 和 setter 来设置字段,因此使用 @Inject 注入模拟是无法创建实例。有没有办法通过更改 API 代码来解决这个问题?
RunWith(PowerMockRunner.class)
@PrepareForTest(UserGroup.class)
public class SomeServiceImplTest {
@Mock
private SomeDAOImpl SomeDAOImpl;
@Mock
private UserGroup userGroup;
@InjectMocks
SomeServiceImpl someServiceImpl;
@Test
public void testSomeMethod(){
String username = "UserToBeTest";
//Some code
//
verify(SomeDAOImpl).saveUserGroup(any(),any());
}
}
public class SomeServiceImpl {
private SomeDAOImpl someDAOImpl;
private SomeIndex someIndex;
public void setSomeDAOImpl(SomeDAOImpl someDAOImpl) {
this.someDAOImpl = someDAOImpl;
}
public SomeServiceImpl (){
someIndex; = AFinalClass.init();
setSomeDAOImpl(new SomeDAOImpl())
}
}
我想阻止 SomeServiceImpl() 被调用。如果有任何方法可以解决此问题,请告诉我。 我可以模拟构造函数吗 - 但是 SomeServiceImpl() 在 testSomeMethod() 之前被调用。
围绕静态方法调用的正常解决方案是引入工厂。
而不是
public class Example {
private void foo() {
Instant now = Instant.now();
}
}
使用
public class Example {
private final Supplier<Instant> instantSupplier;
public Example(Supplier<Instant> instantSupplier) {
this.instantSupplier = instantSupplier;
}
public void foo() {
Instant now = instantSupplier.get();
System.out.println(now);
}
}
现在您可以模拟 Instant 的创建。
@RunWith(MockitoJUnitRunner.class)
public class ExampleTest {
@Mock
Supplier<Instant> instantSupplier;
@Test
public void test() {
Instant myNow = Instant.parse("2007-12-03T10:15:30.00Z");
when(instantSupplier.get()).thenReturn(myNow);
new Example(instantSupplier).foo();
}
}
输出:
2007-12-03T10:15:30Z