java - 使用 Mockito 注入(inject)模拟的类中的父类监视方法

标签 java unit-testing junit mockito

我在带有 Spring 和 Struts 的 Java 项目中使用 Mockito,但我在测试操作时遇到了问题。

我没有使用 Struts2 jUnit 插件来节省使用这种方法进行测试的时间:Strut 2.3.1.2 Unit test, how to remove Spring codependency vs NPE with getContext() .

问题是在我的操作中,当 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 注释 MyAction 维护 @InjectMocks 我有一个 StackOverflowError

我如何才能只监视 ActionSupport.getText() 并让 mockito 在我的操作中注入(inject)模拟?

最佳答案

我会避免使用 @InjectMocks,因为它会自动失败。

只需将构造函数添加到您的 MyAction 仍然使用 @Autowired 即构造函数注入(inject)。这也有助于保证所需的依赖性。

您不需要同时使用 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();
    }
}

InjectMocks fails silently

Constructor injection discussion

关于java - 使用 Mockito 注入(inject)模拟的类中的父类监视方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28086894/

相关文章:

java - Freemarker 获取当前时间戳

java - Java 十六进制字符串转换为字节

QTest : It's possible to test drag&drop?

c++ - 如何在 Catch 框架中使用浮点容差?

java - Mockito 在测试 hibernate 方法时总是返回 NULL

java - 如何在线性时间内找到 2-sum?

java - 以特定方式递归/排序数组

unit-testing - Rx TestScheduler 在 Return 和 Delay 中表现不佳

Ant结合两个refid作为类路径

java - 无法让 Maven 运行 JUnit 测试