我在使用Spring和Struts的Java项目中使用了Mockito,而且测试操作也有问题。
我并不是使用Struts2 jUnit插件来节省测试时间,而是使用以下方法:Strut 2.3.1.2单元测试,如何使用getContext()消除Spring协依赖性和NPE。
问题是,在我的操作中,当调用getText()时,我得到了一个NullPointerException。
我试图监视这个方法,这是从ActionSupport继承的,但是我找不到任何方法,因为这个操作在测试中使用了InjectMocks注释。
下面是一个简单的类示例:
父级:
public class ActionSupport {
public String getText(String aTextName){
return this.getTextProvider().getText(aTextName);
}
}
我的行动:
public class MyAction extends ActionSupport {
@Autowired private IMyService myService;
public String execute(){
getText("SomeText");
myService.something();
return SUCCESS;
}
}
测试:
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@Mock private IMyService myService;
@InjectMocks private MyAction myAction;
@Before
public void before() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test() {
myAction.execute();
}
}
我得到了一个例外:
java.lang.NullPointerException
at com.opensymphony.xwork2.util.TextParseUtil.translateVariables(TextParseUtil.java:167)
at com.opensymphony.xwork2.util.TextParseUtil.translateVariables(TextParseUtil.java:126)
at com.opensymphony.xwork2.util.TextParseUtil.translateVariables(TextParseUtil.java:48)
at com.opensymphony.xwork2.util.LocalizedTextUtil.getDefaultMessage(LocalizedTextUtil.java:663)
at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:534)
at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:362)
at com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:208)
at com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:123)
at com.opensymphony.xwork2.ActionSupport.getText(ActionSupport.java:103)
at es.MyAction.execute(MyAction.java:148)
如果我用“间谍维护”@InjectMocks对MyAction进行注释,我就得到了一个StackOverflowError。
我怎么能只监视ActionSupport.getText()并让mockito在我的行动中注入模拟呢?
发布于 2015-01-23 16:18:20
我将避免使用@InjectMocks
,因为它无声地失败了。
只需将构造函数添加到仍然使用MyAction
(即构造函数注入)的@Autowired
中。这也有助于保证所需的依赖关系。
你不需要initMocks
和MockitoJUnitRunner
。
public class MyAction extends ActionSupport {
private IMyService myService;
@Autowired
public MyAction(MyService myService) {
this.myService = myService;
}
public String execute(){
getText("SomeText");
myService.something();
return SUCCESS;
}
}
@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {
@Mock
private IMyService myService;
private MyAction myAction;
@Before
public void setup() {
myAction = spy(new MyAction(myService));
}
@Test
public void test() {
assertThat(myAction.execute(), equalTo(Action.SUCCESS));
verify(myAction, times(1)).getText();
verify(myService, times(1)).something();
}
}
https://stackoverflow.com/questions/28086894
复制相似问题