S2JUnit4 で、EasyMock で作ったテストスタブをテスト対象にバインディングする
例えば、下のような、他のコンポーネントをバインディングしている FooImpl と言うクラスをテストしようとした場合。
package example import javax.annotation.Resource; import javax.servlet.ServletContext; public class FooImpl implements Foo { @Resource private ServletContext application; …… }
上記の application をEasyMockで作って container に登録しようとした場合に、FooImpl をdicon定義+自動フィールドバインディングにしていると、 @EasyMock(register = true)
より先に解決されてしまう。
TestContext#register を使ってテスト対象のクラスを登録することで回避できた
package example import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import javax.servlet.ServletContext; import org.junit.runner.RunWith; import org.seasar.framework.container.SingletonS2Container; import org.seasar.framework.unit.Seasar2; import org.seasar.framework.unit.TestContext; import org.seasar.framework.unit.annotation.EasyMock; @RunWith(Seasar2.class) public class FooImplTest { private TestContext ctx; @EasyMock(register = true) private ServletContext application; public void before() { ctx.register(FooImpl.class); } public void recordTestFoo() { // expectする } public void testGetWebInfPath() { Foo foo = SingletonS2Container.getComponent(Foo.class); … } }
他にもっとスマートなやり方があるんだろうと思いますが、Java久しぶりだしテストだからここまででいいや。