EasyMock
TestClassA {
void setup() {
//Create mock
ClassBeingMocked mock1 = EasyMock.createMock(ClassBeingMocked);
}
void testMethod() {
//Setup expectations
EasyMock.expect(mock1.getAge()).andReturn(10);
//Replay mode
EasyMock.replay(mock1);
//Test
ClassBeingTested source = new ClassBeingTested();
source.calculateAge(mock1);
//Assertions
assertEquals(50, source.getAverageAge());
//Verification mode
EasyMock.verify(mock1);
}
}
Mockito
TestClassA {
void setup() {
//Create mock
ClassBeingMocked mock1 = Mockito.Mock(ClassBeingMocked);
}
void testMethod() {
//Setup expectations
Mockito.when(mock1.getAge()).thenReturn(10);
//Test
ClassBeingTested source = new ClassBeingTested();
source.calculateAge(mock1);
//Assertions
assertEquals(50, source.getAverageAge());
//Verification mode
Mockito.verify(source).someInternalMethodCalled();
}
}
InjectMocks, Mock usage
ReflectionTestUtils to set private value.
@InjectMocks
private ComponentA componentA;
@Mock
private ComponentB componentB;
@Before
public void setUp()
{
Mockito.when(componentB.B(Mockito.anyObject())).thenReturn(null);
ReflectionTestUtils.setField(componentA, "Feature", true);
}
JMockit
@Mocked //用@Mocked标注的对象,不需要赋值,jmockit自动mock
MyObject obj;
@Test
public void testHello() {
new NonStrictExpectations() {//录制预期模拟行为
{
obj.hello("Zhangsan");
returns("Hello Zhangsan");
//也可以使用:result = "Hello Zhangsan";
}
};
assertEquals("Hello Zhangsan", obj.hello("Zhangsan"));//调用测试方法
new Verifications() {//验证预期Mock行为被调用
{
obj.hello("Hello Zhangsan");
times = 1;
}
};
}
PowerMock
@RunWith(PowerMockRunner.class)
@PrepareForTest({
StaticService.class
})
public class ItemServiceTest {
@Mock
private ItemRepository itemRepository;
@InjectMocks
private ItemService itemService;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test
public void readItemDescriptionWithoutIOException() throws IOException {
//
// Given
//
String fileName = "DummyName";
mockStatic(StaticService.class);
when(StaticService.readFile(fileName)).thenReturn("Dummy");
//
// When
//
String value = itemService.readItemDescription(fileName);
//
// Then
//
verifyStatic(times(1));
StaticService.readFile(fileName);
assertThat(value, equalTo("Dummy"));
}
}
JUnit vs TestNG
JUnit 4 和 TestNG 在表面上是相似的。然而,设计 JUnit 的目的是为了分析代码单元,而 TestNG 的预期用途则针对高级测试。对于大型测试套件,我们不希望在某一项测试失败时就得重新运行数千项测试,TestNG 的灵活性在这里尤为有用。