Java Mock测试工具 博客分类: Test EasyMockmockitoPowerMock
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.21.0</version> <scope>test</scope> </dependency>
import org.junit.Rule; import org.junit.Test; import org.mockito.InOrder; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import java.util.Arrays; import static org.mockito.Mockito.*; public class ExampleTest { @Rule public MockitoRule rule = MockitoJUnit.rule(); @Mock private ArticleCalculator mockCalculator; @Mock private ArticleDatabase mockDatabase; @InjectMocks private ArticleManager articleManager; @Test public void managerCountsArticlesAndSavesThemInTheDatabase() { when(mockCalculator.countArticles("Guardian")).thenReturn(12); when(mockCalculator.countArticlesInPolish(anyString())).thenReturn(5); articleManager.updateArticleCounters("Guardian"); verify(mockDatabase).updateNumberOfArticles("Guardian", 12); verify(mockDatabase).updateNumberOfPolishArticles("Guardian", 5); verify(mockDatabase).updateNumberOfEnglishArticles("Guardian", 7); } @Test public void managerCountsArticlesUsingCalculator() { articleManager.updateArticleCounters("Guardian"); verify(mockCalculator).countArticles("Guardian"); verify(mockCalculator).countArticlesInPolish("Guardian"); } @Test public void managerSavesArticlesInTheDatabase() { articleManager.updateArticleCounters("Guardian"); verify(mockDatabase).updateNumberOfArticles("Guardian", 0); verify(mockDatabase).updateNumberOfPolishArticles("Guardian", 0); verify(mockDatabase).updateNumberOfEnglishArticles("Guardian", 0); } @Test public void managerUpdatesNumberOfRelatedArticles() { Article articleOne = new Article(); Article articleTwo = new Article(); Article articleThree = new Article(); when(mockCalculator.countNumberOfRelatedArticles(articleOne)).thenReturn(1); when(mockCalculator.countNumberOfRelatedArticles(articleTwo)).thenReturn(12); when(mockCalculator.countNumberOfRelatedArticles(articleThree)).thenReturn(0); when(mockDatabase.getArticlesFor("Guardian")).thenReturn(Arrays.asList(articleOne, articleTwo, articleThree)); articleManager.updateRelatedArticlesCounters("Guardian"); verify(mockDatabase).save(articleOne); verify(mockDatabase).save(articleTwo); verify(mockDatabase).save(articleThree); } @Test public void shouldPersistRecalculatedArticle() { Article articleOne = new Article(); Article articleTwo = new Article(); when(mockCalculator.countNumberOfRelatedArticles(articleOne)).thenReturn(1); when(mockCalculator.countNumberOfRelatedArticles(articleTwo)).thenReturn(12); when(mockDatabase.getArticlesFor("Guardian")).thenReturn(Arrays.asList(articleOne, articleTwo)); articleManager.updateRelatedArticlesCounters("Guardian"); InOrder inOrder = inOrder(mockDatabase, mockCalculator); inOrder.verify(mockCalculator).countNumberOfRelatedArticles((Article) anyObject()); inOrder.verify(mockDatabase, atLeastOnce()).save((Article) anyObject()); } }
<dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>3.6</version> <scope>test</scope> </dependency>
import static org.easymock.EasyMock.*; import org.easymock.*; import org.junit.*; public class ExampleTest extends EasyMockSupport { @Rule public EasyMockRule rule = new EasyMockRule(this); @Mock private Collaborator collaborator; // 1 @TestSubject private ClassTested classUnderTest = new ClassTested(); // 2 @Test public void addDocument() { collaborator.documentAdded("New Document"); // 3 replayAll(); // 4 classUnderTest.addDocument("New Document", "content"); // 5 verifyAll(); // 6 } }
- Create the mock
- Have it set to the tested class
- Record what we expect the mock to do
- Tell all mocks we are now doing the actual testing
- Test
- Make sure everything that was supposed to be called was called
PowerMock is a framework that extend other mock libraries such as EasyMock with more powerful capabilities. PowerMock uses a custom classloader and bytecode manipulation to enable mocking of static methods, constructors, final classes and methods, private methods, removal of static initializers and more. By using a custom classloader no changes need to be done to the IDE or continuous integration servers which simplifies adoption. Developers familiar with the supported mock frameworks will find PowerMock easy to use, since the entire expectation API is the same, both for static methods and constructors. PowerMock aims to extend the existing API's with a small number of methods and annotations to enable the extra features. Currently PowerMock supports EasyMock and Mockito.