JUnit setUp在一次测试中被调用两次,并使Powermock expectNew混乱

s2j5cfk0  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(290)

在我的测试中有非常奇怪的行为。

public class MyTestclass {
     @Before
     void setUp(){
        //do some setup, but hu i get called twice
        //here i do some try catch thing to get the stacktrace...
     }

     void testOnlyOneTest(){
        //make the testing, i get called only once
     }

     @After
     void tearDown(){
        //do some destroy things,... i get called twice too
     }
  }

堆栈跟踪:

1)
  MyTestClassTest.setUp() line: 85          
  NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]   
  NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39  
  DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25         
  Method.invoke(Object, Object...) line: 597        
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner(MethodRoadie).runBefores() line: 129                
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner(MethodRoadie).runBeforesThenTestThenAfters(Runnable) line: 93 
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(Method, Object, Runnable) line: 294               
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(Runnable) line: 282               
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner(MethodRoadie).runTest() line: 84          
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner(MethodRoadie).run() line: 49   
  PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(Method, RunNotifier) line: 207  
  PowerMockJUnit44RunnerDelegateImpl.runMethods(RunNotifier) line: 146   
  PowerMockJUnit44RunnerDelegateImpl$1.run() line: 120         
  ClassRoadie.runUnprotected() line: 34 
  ClassRoadie.runProtected() line: 44       
  PowerMockJUnit44RunnerDelegateImpl.run(RunNotifier) line: 118      
  JUnit4TestSuiteChunkerImpl.run(RunNotifier) line: 102              
  PowerMockRunner(AbstractCommonPowerMockRunner).run(RunNotifier) line: 53   
  JUnit4TestClassReference(JUnit4TestReference).run(TestExecution) line: 46  
  TestExecution.run(ITestReference[]) line: 38    
  RemoteTestRunner.runTests(String[], String, TestExecution) line: 467 
  RemoteTestRunner.runTests(TestExecution) line: 683 
  RemoteTestRunner.run() line: 390         
  RemoteTestRunner.main(String[]) line: 197       

  2)
  MyTestClassTest.setUp() line: 85          
  NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]   
  NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39  
  DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25         
  Method.invoke(Object, Object...) line: 597        
  WhiteboxImpl.performMethodInvocation(Object, Method, Object...) line: 2014           
  WhiteboxImpl.doInvokeMethod(Object, Class<?>, String, Object...) line: 885  
  WhiteboxImpl.invokeMethod(Object, String, Object...) line: 713            
  Whitebox.invokeMethod(Object, String, Object...) line: 401     
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runTestMethod() line: 305         
  MethodRoadie$2.run() line: 86                
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner(MethodRoadie).runBeforesThenTestThenAfters(Runnable) line: 94 
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(Method, Object, Runnable) line: 294               
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(Runnable) line: 282               
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner(MethodRoadie).runTest() line: 84          
  PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner(MethodRoadie).run() line: 49   
  PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(Method, RunNotifier) line: 207  
  PowerMockJUnit44RunnerDelegateImpl.runMethods(RunNotifier) line: 146   
  PowerMockJUnit44RunnerDelegateImpl$1.run() line: 120         
  ClassRoadie.runUnprotected() line: 34 
  ClassRoadie.runProtected() line: 44       
  PowerMockJUnit44RunnerDelegateImpl.run(RunNotifier) line: 118      
  JUnit4TestSuiteChunkerImpl.run(RunNotifier) line: 102              
  PowerMockRunner(AbstractCommonPowerMockRunner).run(RunNotifier) line: 53   
  JUnit4TestClassReference(JUnit4TestReference).run(TestExecution) line: 46  
  TestExecution.run(ITestReference[]) line: 38    
  RemoteTestRunner.runTests(String[], String, TestExecution) line: 467 
  RemoteTestRunner.runTests(TestExecution) line: 683 
  RemoteTestRunner.run() line: 390         
  RemoteTestRunner.main(String[]) line: 197

知道为什么我的设置被调用了两次吗?
我在设置中做了一些模拟,在验证后,我得到了预期的2倍,称为1倍,所以我的测试失败。
我使用的是powermock 1.4.8、junit 4.4和easymock框架

odopli94

odopli941#

你的类扩展了TestCase吗?在这个例子中没有,但是我只是想知道是什么原因导致了这个问题。如果它扩展了,那么它会忽略注解,并且把每一个以test开头的方法都当作一个测试用例,这可能会导致你有比你想象的更多的测试。

nzkunb0c

nzkunb0c2#

我认为您应该使用@BeforeClass而不是@Before@Before在每个使用@Test注解的方法之前运行,而@BeforeClass只在所有@Test方法之前运行一次。

w51jfk4q

w51jfk4q3#

首先,您需要将setup方法设置为“static”。
您不能既扩展TestCase又使用注解,因为它们使用不同的runner。因此,当JUnit看到extends TestCase时,它很可能会使用旧的runner,其中**@Test注解将被忽略**。
您可以在不扩展TestCase的情况下简单地将setup方法设置为静态,并使用@Test注解,这应该按照JUnit 4工作

相关问题