EasyMock注释– JUnit 4
EasyMock批注可用于创建Mock对象。
我们还可以告诉EasyMock框架将这些模拟对象注入到另一个具体的类中。
EasyMock注释
我们应该注意两个重要的EasyMock注释:
@Mock:用于指定EasyMock模拟的字段。
@TestSubject:用于指定一个对象,我们希望EasyMock注入使用@Mock注释创建的模拟对象。
EasyMock注释示例
当我们使用EasyMock批注时,我们必须通过以下方法之一显式初始化它们。
@RunWith(EasyMockRunner.class)
:如果我们使用的是JUnit 4,可以使用它,请注意,JUnit 5仍然不支持此功能。
如果我们将其与JUnit 5一起使用,则它将回退以使用JUnit 4运行器类。org.easymock.EasyMockRule:这利用了JUnit 4规则,因此同样不能与JUnit 5一起使用。
EasyMockSupport.injectMocks(this)
:我们可以在@Before方法中使用它来告诉EasyMock注入模拟对象。
这是JUnit 5和TestNG框架的首选方法。
让我们看一下使用EasyMock使用上述所有方法创建模拟对象的示例。
首先,我们将创建一些要模拟的类。
我将在示例中使用JUnit 4,以便展示通过EasyMock注释创建模拟对象的所有三种方式。
package com.theitroad.utils; public interface IntegerUtils { int add(int x, int y); }
package com.theitroad.utils; public interface StringUtils { String reverse(String input); String convert(int i); }
我们将创建上述接口的模拟对象,并将其注入以下具体类中。
package com.theitroad.utils; public class MyUtils { private StringUtils su; private IntegerUtils iu; public MyUtils(StringUtils su, IntegerUtils iu) { this.su = su; this.iu = iu; } public int add(int i, int j) { return iu.add(i, j); } public String reverse(String s) { return su.reverse(s); } public String convert(int i) { return su.convert(i); } }
EasyMockRunner
这是使用带有EasyMock批注的@RunWith(EasyMockRunner.class)
的测试类。
package com.theitroad.easymock; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import org.easymock.EasyMockRunner; import org.easymock.Mock; import org.easymock.TestSubject; import org.junit.Test; import org.junit.runner.RunWith; import com.theitroad.utils.IntegerUtils; import com.theitroad.utils.MyUtils; import com.theitroad.utils.StringUtils; @RunWith(EasyMockRunner.class) public class EasyMockAnnotationsRunWithExample { @Mock StringUtils mockSU; @Mock IntegerUtils mockIU; @TestSubject MyUtils mu = new MyUtils(mockSU, mockIU); @Test public void test() { expect(mockIU.add(10, 10)).andReturn(20); expect(mockSU.convert(10)).andReturn("10"); expect(mockSU.reverse("CAT")).andReturn("TAC"); replay(mockSU, mockIU); assertEquals(20, mu.add(10, 10)); assertEquals("10", mu.convert(10)); assertEquals("TAC", mu.reverse("CAT")); } }
请注意,行为模拟是在模拟对象上完成的。
当我们在TestSubject对象上调用方法时,将在内部调用它们。
EasyMockRule
这是使用EasyMockRule
的代码片段。
我已从测试方法中删除了代码,因为它们与早期的测试方法相同。
package com.theitroad.easymock; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import org.easymock.EasyMockRule; import org.easymock.Mock; import org.easymock.TestSubject; import org.junit.Rule; import org.junit.Test; import com.theitroad.utils.IntegerUtils; import com.theitroad.utils.MyUtils; import com.theitroad.utils.StringUtils; public class EasyMockAnnotationsEasyMockRuleExample { @Mock StringUtils su; @Mock IntegerUtils iu; @TestSubject MyUtils mu = new MyUtils(su, iu); @Rule public EasyMockRule easyMockRule = new EasyMockRule(this); @Test public void test() { } }
EasyMockSupport.injectMocks()
package com.theitroad.easymock; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; import org.easymock.EasyMockSupport; import org.easymock.Mock; import org.easymock.TestSubject; import org.junit.Before; import org.junit.Test; import com.theitroad.utils.IntegerUtils; import com.theitroad.utils.MyUtils; import com.theitroad.utils.StringUtils; public class EasyMockAnnotationsInjectExample { @Mock StringUtils su; @Mock IntegerUtils iu; @TestSubject MyUtils mu = new MyUtils(su, iu); @Before public void setup() { EasyMockSupport.injectMocks(this); } @Test public void test() { } }
这种创建模拟的方式将与JUnit 5以及TestNG测试框架一起使用。