Search code examples
easymockshiro

Easymock and Shiro


I am trying to use AbstractShiroTest abstract class for my unit tests as explained in http://shiro.apache.org/testing.html I have my test class:

public class BeanTest extends AbstractShiroTest {
...
@Test
public void testShiro() {
    Subject subjectUnderTest = createNiceMock(Subject.class);
    expect(subjectUnderTest.isAuthenticated()).andReturn(true);
    expect(subjectUnderTest.getPrincipal()).andReturn("cenap");
    setSubject(subjectUnderTest);
    assertTrue("Subject is not authenticated", SecurityUtils.getSubject().isAuthenticated());
    assertNotNull("Subject principle null", SecurityUtils.getSubject().getPrincipal());
}

@AfterClass
public static void tearDownClass() {  
    tearDownShiro();
} 

Both assertions fail... SecurityUtils.getSubject() returns some object but isAuthenticated() method of that object returns false and getPrincipal() method returns null. "expect" clauses do not seem to work. What am I missing?


Solution

  • Answering my own question as it might help someone. It was a stupid mistake... The trick is: Do not forget adding

    anyTimes();

    after your expect statement and so not forget calling

    replay (subjectUnderTest);

    after that!

    So your BeforeClass method should be like:

    @BeforeClass
    public static void setUpShiro() {
        Subject subjectUnderTest = createNiceMock(Subject.class);
        expect(subjectUnderTest.isAuthenticated()).andReturn(true).anyTimes();
        expect(subjectUnderTest.getPrincipal()).andReturn(Admin).anyTimes();
        setSubject(subjectUnderTest);        
        replay (subjectUnderTest);        
    }