当前位置: 首页 > 知识库问答 >
问题:

在带有Mockito的注入mock的类中,从父类监视方法

万俟均
2023-03-14

我在一个带有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?

共有1个答案

阎冠玉
2023-03-14

我会避免使用@InjectMocks,因为它会无声地失败。

只需在你的MyAction中添加一个构造函数,仍然使用@Autowired即构造函数注入。这也有助于保证所需的依赖性。

您不需要同时使用initMocksMockitoJUnitRunner

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的模糊绑定 在切入点”警告。(我认为这并不一定有意义:为什么不绑定第一个短路评估?) 如果存在类和方法注释,则将先前的尝试自然地分