首页 文章

在类中使用Mockito注入模拟,从父类中窥探方法

提问于
浏览
1

我在使用Spring和Struts的Java项目中使用Mockito,我在测试操作方面遇到了问题 .

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

问题是在我的操作中,当调用getText()时,我有一个NullPointerException .

我'm trying to spy this method, that's继承自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,我会得到一个StackOverflowError .

我怎样才能窥探ActionSupport.getText()并让mockito为我的动作注入嘲笑?

1 回答

  • 2

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

    只需使用 @Autowired (即构造函数注入)向 MyAction 添加构造函数 . 这也有助于保证所需的依赖性 .

    你不需要 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

相关问题