Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito无法使用@InjectMocks创建实例,因为构造函数中存在静态类_Java_Unit Testing_Mockito_Junit4_Powermockito - Fatal编程技术网

Java Mockito无法使用@InjectMocks创建实例,因为构造函数中存在静态类

Java Mockito无法使用@InjectMocks创建实例,因为构造函数中存在静态类,java,unit-testing,mockito,junit4,powermockito,Java,Unit Testing,Mockito,Junit4,Powermockito,我必须用一些代码(不是我自己写的)进行单元测试,但我只停留在一个地方。 我正在使用Powermock和mockito。 所以问题是@InjectMocks甚至在测试一个方法之前就调用了默认构造函数,在默认构造函数中,他们使用了一个静态类和一个setter来设置一个字段,因此使用@Inject注入mock无法创建实例。有没有办法通过更改API代码来解决这个问题 RunWith(PowerMockRunner.class) @PrepareForTest(UserGroup.clas

我必须用一些代码(不是我自己写的)进行单元测试,但我只停留在一个地方。 我正在使用Powermock和mockito。 所以问题是@InjectMocks甚至在测试一个方法之前就调用了默认构造函数,在默认构造函数中,他们使用了一个静态类和一个setter来设置一个字段,因此使用@Inject注入mock无法创建实例。有没有办法通过更改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()。请让我知道是否有任何办法来解决这个问题。
我可以模拟构造函数吗?但是在testSomeMethod()之前调用SomeServiceImpl()。

围绕静态方法调用的正常解决方案是引入工厂

而不是

public class Example {
    private void foo() {
        Instant now = Instant.now();
    }
}
使用

公共类示例{
私人最终供应商即供应商;
公开示例(供应商实例应用程序){
this.instantSupplier=instantSupplier;
}
公共图书馆{
Instant now=instantSupplier.get();
System.out.println(现在);
}
}
现在,您可以模拟瞬间的创建

@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();
    }

}
@RunWith(MockitoJUnitRunner.class)
公共类示例测试{
@嘲弄
供应商和供应商;
@试验
公开无效测试(){
Instant myNow=Instant.parse(“2007-12-03T10:15:30.00Z”);
当(instantSupplier.get())。然后返回(myNow);
新示例(instantSupplier.foo();
}
}
输出:

2007-12-03T10:15:30Z

@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();
    }

}