首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在带有Mockito注入模拟的类中,从父类中监视一个方法

在带有Mockito注入模拟的类中,从父类中监视一个方法
EN

Stack Overflow用户
提问于 2015-01-22 10:49:39
回答 1查看 2.2K关注 0票数 1

我在使用Spring和Struts的Java项目中使用了Mockito,而且测试操作也有问题。

我并不是使用Struts2 jUnit插件来节省测试时间,而是使用以下方法:Strut 2.3.1.2单元测试,如何使用getContext()消除Spring协依赖性和NPE

问题是,在我的操作中,当调用getText()时,我得到了一个NullPointerException。

我试图监视这个方法,这是从ActionSupport继承的,但是我找不到任何方法,因为这个操作在测试中使用了InjectMocks注释。

下面是一个简单的类示例:

父级:

代码语言:javascript
运行
复制
public class ActionSupport {
    public String getText(String  aTextName){
        return this.getTextProvider().getText(aTextName);
    }
}

我的行动:

代码语言:javascript
运行
复制
public class MyAction extends ActionSupport {
    @Autowired private IMyService myService;

    public String execute(){
        getText("SomeText");
        myService.something();
        return SUCCESS;
    }
}

测试:

代码语言:javascript
运行
复制
@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();
    }
}

我得到了一个例外:

代码语言:javascript
运行
复制
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在我的行动中注入模拟呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-23 16:18:20

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

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

你不需要initMocksMockitoJUnitRunner

代码语言:javascript
运行
复制
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无声地失败

构造函数注入讨论

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28086894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档