我在一个带有Spring和Struts的Java项目中使用Mockito,在测试操作方面遇到了问题。
我没有使用Struts2 jUnit插件来节省使用这种方法进行测试的时间:Strut2.3.1.2Unit test,如何使用getContext()删除Spring依赖关系vs 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)
如果我用@Spy维护@InjectMocks注释MyAction,我就会遇到StackOverflow Error。
我怎么能只监视ActionSupport呢。getText()并让mockito在我的操作中注入mocks?
我会避免使用@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();
}
}
Mocks默默地失败了
构造函数注入讨论
我有一个spring-boot应用程序,它通过一个控制器公开了一个REST接口。这是我的控制器的一个例子: 我试图为这个类编写单元测试,并且我必须模拟处理器(因为处理需要很长时间,并且我试图在测试控制器行为时避免这一步)。请注意,为了这个问题,所提供的示例被简化了。
有什么建议吗?我如何让Mockito正确地将一个mock注入到一个接口私有字段?
我正在为扩展了B类的a类编写单元测试。我正在使用Mockito,我想模拟一个组织。slf4j。这两个类都可以使用。问题是,当类A从类B调用方法时,模拟记录器没有被注入到类B中,所以我得到了一个NPE。有没有办法成功地测试这一点?
add:如果我将方法存根添加到Fragment2中,就可以开始使用next annotation,但这是一个非常难看的解决方案 解决方案:多亏了@Kriegaex,我找到了解决方案:
问题内容: 通过将Angular 1.4与ES6 / 7和Babel结合使用,我可以在类块之后使用以下代码将参数成功地注入到名为Controller的类中: 但是,在构造函数上方看到inject参数会更干净。我见过其他人使用静态$ inject,但出现错误。这是我正在尝试的: 为什么会导致此错误?它似乎为其他人工作。 问题答案: 那是实验性提议的语法。在Babel中,您必须启用。通过 通天塔。确切
问题内容: 我需要 在类中使用@X注释的方法或使用@X注释的方法的切入点 。我还 需要注释对象 。如果同时注释了类和方法,则 我更喜欢将方法注释作为参数 。 我尝试了以下操作,这将创建“不一致的绑定”警告。(为什么不将它们设置为null?) 下面创建“跨’||’的参数x的模糊绑定 在切入点”警告。(我认为这并不一定有意义:为什么不绑定第一个短路评估?) 如果存在类和方法注释,则将先前的尝试自然地分