2013-10-01 65 views
0

我一直在尝试一段时间来嘲笑我的代码。我很喜欢嘲笑我前面的很多事情。我将Mockito和Easymock集成在一起使用Powermockito。嘲笑时递归调用系统

我在模拟想要测试的方法内部的方法时遇到了困难。因此,这里是我面临的情况为例:

public class trialClass { 
public static int try2(){  
     return 3;  
    } 

    public static int try(int a){  
     return try2() + a;  
    } 
} 

和我的测试类是:

@RunWith(PowerMockRunner.class) 
@PrepareForTest(trial.class) 
public class trialTest { 

    @Before 
    public void setUp() throws Exception {  
     PowerMockito.mockStatic(trial.class);  

     //Here I expect try2() to return 10, even it return 3 
     PowerMockito.when(trial.try2()).thenReturn(10);  
    } 

    @Test 
    public void testtry() throws Exception { 
     //After try2() returns 10 recursively inside my try() method, 
     //I expect result to be 11 
     Assert.assertEquals(11, trial.try(1));  
    } 
} 

我的这个问题实际上来自我的会话变量。我的会话保存了一些值,X方法返回该值。我所需要的就是递归地模拟X方法,这个问题只是模拟这种情况。

感谢您的帮助球员。

+0

Java命名:**班级名称从首都**开始! – ppeterka

回答

0

编辑

它发生,我认为你可能不希望更改为EasyMock的替代的Mockito,在这种情况下,请无视...

部分嘲讽是你以后的关键字。你不想嘲笑一切,只需要try2()。您应该使用PowerMock.mockStaticPartial(Class, String...)方法。

而不是

PowerMockito.mockStatic(trialClass.class);  

使用

PowerMock.mockStaticPartial(trialClass.class, "try2"); 

然后做实际的嘲讽。

另外请注意,您所定义的CLAS如在上面的代码trialClass,但在第二个代码中使用trial.class ...

+0

这里的问题是,我不使用Powermock,这就是为什么在这种情况下找不到mockStaticPartial方法。如果将其纳入我的项目范围,它会如何影响我目前的嘲笑和单元测试结构? –

1

您需要使用Mockito.CALLS_REAL_METHODS

所以在测试设置:

PowerMockito.mockStatic(trial.class, CALLS_REAL_METHODS); 
+0

这工作得很好。谢谢。但是,它是否会导致实时数据更改?我以前听过类似的话。 –

0

请使用EasyMock和PowerMock作为解决方案,找到TrialTest.java的更新版本。 PowerMock易于配置,不会干扰大多数现有的罐子。你只需要一个几杯啤酒

  • powermock-EasyMock的-XXX-full.jar
  • EasyMock的-XXjar

你有你的代码,我修正了一些问题:

  • 代码问题:尝试是Java关键字,因此它不能用于方法名称中(例如,尝试(int a))。
  • 代码质量:使用Java对象而不是Java原语(例如,使用整数而不是int)。
  • 代码质量:trialClass是一个糟糕的Java类名(例如,使用Java类名的upperCase,除非出于教育目的,不要使用通用词类),也许是试用版。

下面是更新后的代码:

Trial.java(CUT)

public class Trial { 

    public static Integer try2() { 
     return 3; 
    } 

    public static Integer try1(int a) { 
     return try2() + a; 
    } 
} 

工作测试类:TrialTest.java

import org.easymock.EasyMock; 
import org.junit.Assert; 
import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.api.easymock.PowerMock; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

@RunWith(PowerMockRunner.class) 
@PrepareForTest(Trial.class) 
public class TrialTest { 

    @Before 
    public void setUp() throws Exception { 

     /* Setup */ 
     PowerMock.mockStaticPartial(Trial.class, "try2"); 

     /* Mocks */ 
     // Here I expect try2() to return 10, even it return 3 
     EasyMock.expect(Trial.try2()).andReturn(10).atLeastOnce(); 

     PowerMock.replayAll(); 

    } 

    @Test 
    public void testtry() throws Exception { 
     // After try2() returns 10 recursively inside my try() method, 
     // I expect result to be 11 
     /* Test */ 
     Integer result = Trial.try1(1); 

     /* Asserts */ 
     PowerMock.verifyAll(); 
     Assert.assertEquals(new Integer(11), result); 

    } 
}