【问题标题】:JUnit setUp gets invoked TWO times with one test and messing up Powermock expectNewJUnit setUp 在一次测试中被调用两次并搞砸了 Powermock expectNew
【发布时间】:2011-05-12 12:26:46
【问题描述】:

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

  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       

知道为什么我的 setUp 会被调用两次吗?

我在 setUp 中进行了一些模拟,经过验证后,我得到了预期的 2 次调用 1 次,所以我的测试失败了。

我正在使用 powermock 1.4.8、junit 4.4 和 easymock 框架

【问题讨论】:

  • 尝试重命名setup和teardown方法,看看是否有区别。
  • @Peter ty,但我已经试过了。

标签: java junit mocking easymock powermock


【解决方案1】:

您的课程是否扩展了 TestCase?在示例中似乎没有,但我只是想想想 可能 是什么原因造成的。如果确实如此,那么它将忽略注释,并将每个以单词 test 开头的方法视为测试用例,从而导致您进行的测试可能比您想象的要多。

【讨论】:

  • 该死的你很好 ;) 是的,你是对的,我的 testclass 从我项目中的测试超类扩展而来,而一个从 TestCase 扩展而来......那个野兽执行了它 test**** 方法和powermock 执行了@Test 带注释的测试....该死的你很好! ty :D
【解决方案2】:

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

【讨论】:

  • 这可能行得通,但我认为问题在于只有一种方法用@Test 注释。
  • 既然您提到了由于没有 @Test 带注释的方法,那么如何运行任何测试?一个快速测试表明 JUnit4 只运行带有该注释的方法,所以也许 PowerMock 正在这样做?我想知道这是否是问题的根源。
  • @Pace 是的,这正是我的问题
  • 我认为 powermock 正在做某事。但是我不知道是什么,如果您查看堆栈跟踪,其中大多数是相同的,但是在 whiteboximpl 中让我发疯,我找不到那里的问题...
猜你喜欢
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 2022-12-09
  • 2016-10-03
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 2017-01-28
相关资源
最近更新 更多