Frank van der Linden asked in his blog post (http://elstarit.nl/?p=157) if EasyMock or PowerMock can be integrated into the org.openntf.junit.xsp and Ryan J. Baxter mentioned also that a testing framework without a good mocking solution is only the half worth.
Only the half worth is a good reason to complete the effort. So I implemented also EasyMock and PowerMock to the org.openntf.junit.xsp. With version 1.1.0 you get the capabilty to mock objects. You may ask how does EasyMock work. Her a small example:
Imagine this. You have this class called Share. The class can be initialized with a builder method called initFromDocument( Document doc) and you want to test this method.
package org.openntf.junit.example.bo; import lotus.domino.Document; public class Share { private String m_ShareName; private int m_Count; private int m_PricePerShare; public static Share initFromDocument( Document doc) { Share share = new Share(); try { share.m_ShareName = doc.getItemValueString("ShareName"); share.m_Count = doc.getItemValueInteger("Count"); share.m_PricePerShare = doc.getItemValueInteger("PricePerShare"); } catch (Exception ex) { ex.printStackTrace(); return null; } return share; } public String getShareName() { return m_ShareName; } public int getCount() { return m_Count; } public int getPricePerShare() { return m_PricePerShare; } public Object getValue() { return m_Count * m_PricePerShare; } }
Your intention is now to write a test for that (or better you write first the test). But you wont initialize a Notes Document, because one thing that unit testing is about has to do with isolation. At this point comes EasyMock to the game:
package org.openntf.junit.example; import lotus.domino.Document; import org.junit.Test; import org.openntf.junit.example.bo.Share; import org.openntf.junit.xsp.easymock.EasyMockWrapper; import static org.easymock.EasyMock.*; import static org.junit.Assert.*; public class ShareTest { @Test public void testShareWithDocumentMock() { Document docMock = EasyMockWrapper.createNiceMock(Document.class); try { expect(docMock.getItemValueString("ShareName")).andReturn("WebGate"); expect(docMock.getItemValueInteger("Count")).andReturn(5); expect(docMock.getItemValueInteger("PricePerShare")).andReturn(2870); replay(docMock); Share shareWebGate = Share.initFromDocument(docMock); assertEquals("WebGate", shareWebGate.getShareName()); assertEquals(5 * 2870, shareWebGate.getValue()); } catch (Exception e) { e.printStackTrace(); assertFalse(true); } } }
With
Document docMock = EasyMockWrapper.createNiceMock(Document.class);
initialize EasyMock a new document object. You may recognize that instead of calling EasyMock.createNiceMock(), I’m calling EasyMockWrapper.createNiceMock(). This is needed because of security issues.
Now we can “record” what will happen to the docMock object. We have 1 call of getItemValueString(“ShareName”) and 2 calls to getItemValueInteger(). For each call can we define what value should be returned.
expect(docMock.getItemValueString("ShareName")).andReturn("WebGate"); expect(docMock.getItemValueInteger("Count")).andReturn(5); expect(docMock.getItemValueInteger("PricePerShare")).andReturn(2870);
Like on the tape recorder. It’s time to go back to start. You do this with
replay(docMock);
Now our mocked document object is ready and you can test the initFromDocument method.
There is a lot more to cove about mocking and this only the start.
Have fun (and don’t forget to use the EasyMockWrapper)
Christian
leader80Giovanni
September 4, 2014 at 2:24 pm
… Power mock is way better! how do you mock an XSP Context?