繁体   English   中英

我们可以将Mockito和PowerMockito用于同一junit测试类吗

[英]Can we use Mockito and PowerMockito for same junit test class

我有一个仅具有一个method的java类,在该方法内部我正在object for another class创建object for another class ,因此我正在使用PowerMockito.whenNew(fullyQualifiedClassName).withAnyArguments().thenReturn(mockObject); 在同一方法中,我还必须模拟另一种method(non-static) ,因此我必须在此处使用Mockito ,例如Mockito.when(mockObject.method1(1000)).thenReturn(createdObject);//showing error here 我收到如下错误

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at com.tocassandra.DMCassandraTest.test(DMCassandraTest.java:38)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!
 3: you are stubbing the behaviour of another mock inside before         'thenReturn' instruction if completed

at com.tocassandra.DMCassandraTest.test(DMCassandraTest.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:326)
at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:88)
at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:96)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:310)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:131)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.access$100(PowerMockJUnit47RunnerDelegateImpl.java:59)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner$TestExecutorStatement.evaluate(PowerMockJUnit47RunnerDelegateImpl.java:147)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.evaluateStatement(PowerMockJUnit47RunnerDelegateImpl.java:107)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:298)
at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86)
at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:218)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:160)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:134)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:136)
at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:117)
at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:57)
at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

我用注释声明了Junit Test class

@RunWith(PowerMockRunner.class) @PrepareForTest({NewObjectClass.class})

示例代码:-

原始方法如下所示

public static void insertData(String name) throws Exception {

    ObjectMapper mapper = new ObjectMapper();
    SampleA sample = new SampleA("args1","arg2",4);

    sample.subscribe(name); //its a void method
    logger.info("subscibed to the topic {}", ConsumerTopicName);
    cluster = Cluster.builder().addContactPoints(CASSANDRA_CONNECTION_HOST.split(",")).build();
    session = cluster.connect(KEYSPACE);

    try {

        while (true) {
            try {
                SampleRecords records = sample.getRecords("argValue");
                for (Record record : records) {

                    A a = mapper.readValue(record.value(), A.class);

                    dao.insertData(session, a);
                }
            } catch (Exception ex) {
                logger.error("Exception while reading data from kafka", ex);
            }
        }
    } finally {
        consumer.close();
    }
}

测试类别:-

@RunWith(PowerMockRunner.class)
@PrepareForTest({SampleA.class})
public class DMCassandraTest {

SampleA sample = Mockito.mock(SampleA.class);
@Test
public void test() throws Exception{
    String name = "test";
    PowerMockito.whenNew("org.companny.SampleA").withAnyArguments().thenReturn(sample);
    Mockito.doAnswer(new Answer(){

        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            sample.subscribe(name);
            return null;
        }

    }).when(SampleA.class);
    // Above code is to mock void subscribe method in insertData, even I am 
    // not sure whther it works or not
    SampleRecords records = new SampleReccords();
    // setting values to records
    Mockito.when(sample.getRecords("argdValue")).thenReturn(records);
    insertToCassandra.insertData(name);
}
}

主要问题是此块:

Mockito.doAnswer(new Answer(){

    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
        sample.subscribe(name);
        return null;
    }

}).when(SampleA.class);

Mockito在问你,“ 什么时候 ?” 您未指定Mockito的模拟应何时回复。 逻辑上看来,您想要在subscribe之后执行此操作。

但是,说实话,我没有太多机会(或理由)来嘲笑。 您获得的实例是经过具体定义的,因此无法轻松地注入实例以增加其值的差异。 我的建议是不要将它们模拟出来,直到您可以将SampleA注入SampleA某个地方为止,这样,添加模拟比依赖PowerMockito麻烦些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM