2017-09-27 18 views
2

我试图运行下面的单元测试 - 采用TestNGMockitoJava7的Mockito UnfinishedStubbingException缺少thenReturn或者你正试图存根最终方法

import static org.mockito.Matchers.any; 
import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.never; 
import static org.mockito.Mockito.times; 
import static org.mockito.Mockito.verify; 
import static org.mockito.Mockito.when; 
import static org.mockito.Mockito.when; 
import static org.powermock.api.mockito.PowerMockito.mockStatic; 
import static org.powermock.api.mockito.PowerMockito.doReturn; 
import junit.framework.Assert; 

import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.testng.annotations.Test; 

@PrepareForTest({TestA.class, TestB.class, Result.class, C.class}) 
public class TestDummy { 

    @Test 
    public void testIt() throws Exception { 
     mockStatic(TestB.class); 
     Result r = mock(Result.class); 
     r.res = 2; 
     TestB tB = mock(TestB.class); 
     doReturn(tB).when(TestB.class, "get"); 
     when(tB.doSome(any(C.class))).thenReturn(r); 

     Result rA = TestA.run(); 

     Assert.assertEquals(2, rA.res); 
    } 
} 

下面TestDummy是我试图运行的源代码上述的单元测试 -

class TestA { 

    public static Result run() { 
     TestB tB=TestB.get(); 
     return tB.doSome(new C()); 
    } 
} 

class Result { 
    int res; 
} 

class TestB { 

    static final TestB INS = new TestB(); 
    public static TestB get() { 
     return INS; 
    } 

    public Result doSome(C c) { 

     Result r = new Result(); 
     r.res=1; 
     return r; 
    } 
} 

class C { 

} 

但失败,下面的错误 -

Running TestDummy 
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 1.268 sec <<< FAILURE! - in TestDummy 
testIt(TestDummy) Time elapsed: 0.527 sec <<< FAILURE! 
org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here: 
-> at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:36) 

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! 
at TestDummy.testIt(TestDummy.java:25) 

看起来是一个微不足道的问题,但在这里停留了一段时间。希望任何输入来解决这个问题,而不修改源代码(修改单元测试 - TestDummy应该没问题)。我看到很多关于类似/相同问题的帖子,但是这些建议在这里似乎并不奏效。

回答

1

使用JUnit使用@RunWith但使用TestNG你需要在你的测试用例来指定这个:

@ObjectFactory public IObjectFactory getObjectFactory() { 
    return new org.powermock.modules.testng.PowerMockObjectFactory(); 
} 

记得添加在您的POM这种依赖关系:

<dependency> 
    <groupId>org.powermock</groupId> 
    <artifactId>powermock-module-testng</artifactId> 
    <version>1.7.3</version> 
    <scope>test</scope> 
</dependency> 
+0

谢谢你,让我的一天:) –

1

这个问题被加上junit4但所提供的代码(这是一个非常有用的MCVE,谢谢:)建议你用TestNG,TestDummy包括该进口

org.testng.annotations.Test 

所以,我不知道你正在使用的。

无论如何,你的代码看起来很稳固,我通过一个简单的改变就成功地运行了它;将@RunWith(PowerMockRunner.class)添加到TestDummy

  • JUnit的4.12
  • Powermock 1.7
  • 的Mockito 2.7.19:

    这是使用下面的验证。

+0

张冠李戴为junit4而不是testng,我的不好! –

+0

没问题,我刚刚更新了这个问题来切换标签,我看到你已经有了解决方案,在其他答案:) – glytching

相关问题