在 class 中侦测父 class 的方法,并使用 Mockito 注入模拟
Spy a method from parent class in a class with injected mocks with Mockito
我在 Java 项目中使用 Mockito Spring 和 Struts,我在测试操作时遇到问题。
我没有使用 Struts2 jUnit 插件来节省使用这种方法进行测试的时间:Strut 2.3.1.2 Unit test, how to remove Spring codependency vs NPE with getContext()。
问题是在我的操作中,当调用 getText() 时我遇到了 NullPointerException。
我正在尝试侦测此方法,它继承自 ActionSupport,但我找不到方法,因为该操作使用 InjectMocks[= 注释48=]在测试中。
这是 类 的一个简单示例:
家长:
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)
如果我用 @Spy 注释 MyAction 维护 @InjectMocks 我有WhosebugError.
我怎样才能只监视 ActionSupport.getText() 并让 mockito 对我的操作注入模拟?
我会避免使用 @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();
}
}
我在 Java 项目中使用 Mockito Spring 和 Struts,我在测试操作时遇到问题。
我没有使用 Struts2 jUnit 插件来节省使用这种方法进行测试的时间:Strut 2.3.1.2 Unit test, how to remove Spring codependency vs NPE with getContext()。
问题是在我的操作中,当调用 getText() 时我遇到了 NullPointerException。
我正在尝试侦测此方法,它继承自 ActionSupport,但我找不到方法,因为该操作使用 InjectMocks[= 注释48=]在测试中。
这是 类 的一个简单示例:
家长:
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)
如果我用 @Spy 注释 MyAction 维护 @InjectMocks 我有WhosebugError.
我怎样才能只监视 ActionSupport.getText() 并让 mockito 对我的操作注入模拟?
我会避免使用 @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();
}
}