power mock at ore dev
TRANSCRIPT
-
7/31/2019 Power Mock at Ore Dev
1/24
Certified Java Professionals
Johan Haleby and Jan Kronquist
www.powermock.org
Test the untestable
1
http://www.powermock.org/http://www.powermock.org/ -
7/31/2019 Power Mock at Ore Dev
2/24
Certified Java Professionals
Audience survey
Writing unit tests?Using mock framework?
Using EasyMock?
Frustrated with current limitations?
2
-
7/31/2019 Power Mock at Ore Dev
3/24
Certified Java Professionals
Automated + isolated testing
TestCase
CodeUnderTest
A
B
Mock A
Mock B
3
-
7/31/2019 Power Mock at Ore Dev
4/24
Certified Java Professionals
Mock objects and stubs
Simulated objects that mimic behavior of real objects
Stubs provide canned replies
Mocks verify expectations
4
-
7/31/2019 Power Mock at Ore Dev
5/24
Certified Java Professionals
EasyMock
// Create a mock
SomeInterface mock = createMock(SomeInterface.class);
// Record behavior
expect(mock.doStuff("argument")).andReturn("returnValue");
// Replay behavior
replay(mock);
// Executing the code we want to test
assertEquals("returnValue", test.perform());
// Verify behavior
verify(mock);
5
-
7/31/2019 Power Mock at Ore Dev
6/24
Certified Java Professionals
Traditional assumptions
Testable = good design
Testable = easy to understand
Testable = limitations
6
-
7/31/2019 Power Mock at Ore Dev
7/24
Certified Java Professionals
Problem - Static methods
Not possible to mock
Still 3rd party libraries that use them
Eclipse, Java ME
7
-
7/31/2019 Power Mock at Ore Dev
8/24
Certified Java Professionals
Problem - Static initializers
You cannot unit test a class with evil static initializerpublic class EvilStaticInitializer {
static {
System.loadLibrary(evil.dll);
}
}
8
-
7/31/2019 Power Mock at Ore Dev
9/24
Certified Java Professionals
Problem - Final class / method
Final methods cannot be mocked
Why use final?
Ensure that your classes are not misused
Correct object construction
Examples: Wicket, Apache Mina
9
-
7/31/2019 Power Mock at Ore Dev
10/24
Certified Java Professionals
Problem - Private methods/state
Invocation is hardMocking not possible
State access not possible
Private is used to enforce encapsulation
10
-
7/31/2019 Power Mock at Ore Dev
11/24
Certified Java Professionals
Problem - Using new
Code not designed for testingNot everything needs to be injected
File file = new File(fileName);
if (file.exists()) {
doStuff();
}
11
-
7/31/2019 Power Mock at Ore Dev
12/24
Certified Java Professionals
Traditional solutions
Better design and IoC
Wrap static methods
Factory methods
Package private instead of privateAvoid final and static initializers
12
-
7/31/2019 Power Mock at Ore Dev
13/24
Certified Java Professionals
Static method - example
publicclass MessageDao {
publicvoid addMessage(Message message) throws RecordStoreException { RecordStore recordStore = null; try { recordStore = RecordStore.openRecordStore(name, true); ...
} finally { if (recordStore != null) { recordStore.closeRecordStore(); } } }}
13
-
7/31/2019 Power Mock at Ore Dev
14/24
Certified Java Professionals
Solution 1 - Partial mock
publicclass MessageDao {
publicvoid addMessage(Message message) throws RecordStoreException { RecordStore recordStore = null; try { recordStore = openOrCreateRecordStore(name); ...
} finally { if (recordStore != null) { recordStore.closeRecordStore(); } } } protected RecordStore openOrCreateRecordStore(String name) { return RecordStore.openRecordStore(name, true); }}
14
-
7/31/2019 Power Mock at Ore Dev
15/24
Certified Java Professionals
Solution 2 - DI
publicclass MessageDao {
private RecordStoreFactory recordStoreFactory; public MessageDao(RecordStoreFactory recordStoreFactory) { this.recordStoreFactory = recordStoreFactory; } publicvoid addMessage(Message message) throws RecordStoreException {
RecordStore recordStore = null; try { recordStore = recordStoreFactory.openOrCreateRecordStore(name); ... } finally { if (recordStore != null) { recordStore.closeRecordStore(); } } }}
15
-
7/31/2019 Power Mock at Ore Dev
16/24
Certified Java Professionals
Static method - example
publicclass MessageDao {
publicvoid addMessage(Message message) throws RecordStoreException { RecordStore recordStore = null; try { recordStore = RecordStore.openRecordStore(name, true); ...
} finally { if (recordStore != null) { recordStore.closeRecordStore(); } } }}
16
-
7/31/2019 Power Mock at Ore Dev
17/24
Certified Java Professionals
Using PowerMock
publicclass MessageDao {
publicvoid addMessage(Message message) throws RecordStoreException { RecordStore recordStore = null; try { recordStore = RecordStore.openRecordStore(name, true); ...
} finally { if (recordStore != null) { recordStore.closeRecordStore(); } } }}
17
-
7/31/2019 Power Mock at Ore Dev
18/24
Certified Java Professionals
PowerMock test case
publicclass MessageDaoTest {
publicvoid testAddMessage() throws Exception { mockStatic(RecordStore.class); // Record behavior expect(RecordStore.openRecordStore("name", true))
.andReturn(recordStoreMock);
// Replay behavior replay(RecordStore.class); // Executing the code we want to test Message message = new Message(); messageDao.addMessage(message);
...
// Verify behavior verify(RecordStore.class); }}
@RunWith(PowerMockRunner.class)
@PrepareForTest(RecordStore.class)
18
-
7/31/2019 Power Mock at Ore Dev
19/24
Certified Java Professionals
PowerMock
Drop in jar file
Allow full semantics of the language
Clean separation of test and production code
Extends EasyMockOpen source (Apache License 2.0)
19
-
7/31/2019 Power Mock at Ore Dev
20/24
Certified Java Professionals
DEMO
Mock static method
Mock construction
Suppress static initializers
20
-
7/31/2019 Power Mock at Ore Dev
21/24
Certified Java Professionals
Traditional assumptions
Testable = good design
Testable = easy to understand
Testable = limitations
arewrong
21
-
7/31/2019 Power Mock at Ore Dev
22/24
Certified Java Professionals
Future
Anonymous inner classes
Improved mock creation
Improved type safety
Other test frameworksOther mock frameworks
22
-
7/31/2019 Power Mock at Ore Dev
23/24
Certified Java Professionals
Benefits
Testable legacy code
Third party code
More design options
23
-
7/31/2019 Power Mock at Ore Dev
24/24
Certified Java Professionals
www.powermock.org
http://www.powermock.org/http://www.powermock.org/