[Seasar-user:13912] Re: [Dbflute] Junitテストの時Bhvがnullになります。

kubo [E-MAIL ADDRESS DELETED]
2008年 4月 24日 (木) 12:02:14 JST


久保です。

Yuuさん、こんにちは

>  public class RegisterPageTest extends S2TestCase {
>
>         RegisterPage registerPage = new RegisterPage();

こちらで「new RegisterPage()」とされているため、
registerPageの全てのフィールドはnullのはずです。
ご自身でインスタンスを生成することで、
Seasarのコンポーネントとしては扱われないためです。

S2TestCaseは、テストケース自体のフィールドに
Diconに登録されているコンポーネントをインジェクションします。
例えば、以下のように書けば、テストクラスにBehaviorが
インジェクションされるはずです。

public class RegisterPageTest extends S2TestCase {

    UserdetailsBhv userdetailsBhv;
    public void test_xxx() {
        userdetailsBhv.outside()... // nullじゃないはず
    }

ただ、RegisterPageを上記のように設定してテストしやすい形に
振舞うかは自分はやってことありません。
(Interceptorとか動いてしまわないか!?!?)

自分がTeedaを使ったときにやったPageクラスのテストは以下のような感じです。
この方法で全てのPageクラスをテストしていました。

1. RegisterPageをテストメソッドで自分でnewする。
2. UserdetailsBhvはテストクラスにインジェクションしてもらう。
3. 自分でnewしたRegisterPageにUserdetailsBhvを手動で設定
4. RegisterPageを実行

public class RegisterPageTest extends S2TestCase {

    UserdetailsBhv userdetailsBhv;
    public void test_xxx() {
        // ## Arrange ##
        RegisterPage page = new RegisterPage();
        page.userdetailsBhv = this.userdetailsBhv;
        Random a= new Random();
        page.uid = "t"+a.nextInt(999);

        // ## Act ##
        Class clazz = page.doSave();

        ...
    }

実際には、
        RegisterPage page = new RegisterPage();
        page.userdetailsBhv = this.userdetailsBhv;
の部分は、protectedメソッドにでもして、テストメソッド間で
再利用しておりましたが。。。




2008/4/24 Yuu <[E-MAIL ADDRESS DELETED]>:
>
>  いつもお世話になっております。
>
>  今日はテストについて質問があります。
>
>  普通の時は問題ないbhv処理が
>  (system.out.printlnして見たら
>  [E-MAIL ADDRESS DELETED]とnullではなく
>  何か値が入っています。)
>  Junitテストする時だけ
>  Nullになってsystem.out.printlnして見てもnullになっています。
>  (テストクラスにSystem.out.println(registerPage.userdetailsBhv);してみたら
>  nullが確認できます。registerPage自体のsystem.out.printlnにもnullです。)
>
>  この理由でnullPointExceptionで発生しテストが出来なくなります。
>
>  テストクラスのsetUp()は
>  @Before
>         public void setUp() throws Exception {
>                 include("dbflute.dicon");
>>  でしたが
>
>  @Before
>         public void setUp() throws Exception {
>                 super.setUp();
>                 include("dbflute.dicon");
>                 include("jdbc.dicon");
>                 include("app_aop.dicon");
>                 include("app.dicon");
>                 include("customizer.dicon");
>                 include("teedaCustomize.dicon");
>                 include("s2container.dicon");
>                 include("creator.dicon");
>                 include("convention.dicon");
>         }
>  までやって見てもbhvのnull問題が解消できません。
>
>  今テストクラスのソースを記述します。
>
>  package sampleproject.web.login;
>
>  import java.util.Random;
>
>  import org.seasar.extension.unit.S2TestCase;
>  import static org.junit.Assert.*;
>  import org.junit.Before;
>  import org.junit.Test;
>  import  sampleproject.web.login.RegisterPage;
>
>  import sampleproject.dbflute.exbhv.UserdetailsBhv;
>  import sampleproject.dbflute.exdao.pmbean.SimpleselectUserdetailspmb;
>  import sampleproject.dbflute.exentity.Userdetails;
>  import sampleproject.dbflute.exentity.Users;
>  import sampleproject.dbflute.exentity.customize.SimpleUserdetails;
>
>  public class RegisterPageTest extends S2TestCase {
>
>         RegisterPage registerPage = new RegisterPage();
>         //UserdetailsBhv userdetailsBhv = new UserdetailsBhv();
>
>         @Before
>         public void setUp() throws Exception {
>                 super.setUp();
>                 include("dbflute.dicon");
>                 include("jdbc.dicon");
>                 include("app_aop.dicon");
>                 include("app.dicon");
>                 include("customizer.dicon");
>                 include("teedaCustomize.dicon");
>                 include("s2container.dicon");
>                 include("creator.dicon");
>                 include("convention.dicon");
>         }
>
>
>         @Test
>         public void testDoSave() {
>
>                 final Class<SimpleUserdetails> entityType = SimpleUserdetails.class;
>                 final SimpleselectUserdetailspmb pmb = new SimpleselectUserdetailspmb();
>                 UserdetailsBhv userdetailsBhv;
>                 Random a= new Random();
>                 registerPage.uid = "t"+a.nextInt(999);
>
>                 System.out.println(registerPage.userdetailsBhv);
>                 Class result = registerPage.doSave();
>
>         assertNotNull(result);
>                 assertNotNull(registerPage.userexistmsg);
>         }
>
>         @Test
>         public void testUsercheck() {
>                 registerPage.uid = "test";
>                 assertFalse(registerPage.usercheck());
>         }
>
>         @Test
>         public void testInitialize() throws Exception {
>
>                 Boolean result =true;
>                 try {
>                         registerPage.initialize();
>                 }catch(Exception e){
>                         result = false;
>                         throw e;
>                 }
>
>                 assertTrue(result);
>         }
>
>         @Test
>         public void testPrerender() throws Exception {
>                 Boolean result =true;
>                 try {
>                         registerPage.prerender();
>                 }catch(Exception e){
>                         result = false;
>                         throw e;
>                 }
>
>                 assertTrue(result);
>
>         }
>
>
>  }
>
>  テスト対象のRegisterPage.java
>
>  package sampleproject.web.login;
>
>  import java.util.List;
>
>  import org.seasar.teeda.extension.annotation.validator.Length;
>  import org.seasar.teeda.extension.annotation.validator.Required;
>  import org.seasar.teeda.extension.util.LabelHelper;
>
>  import sampleproject.dbflute.cbean.UserdetailsCB;
>  import sampleproject.dbflute.cbean.UsersCB;
>  import sampleproject.dbflute.exbhv.UserdetailsBhv;
>  import sampleproject.dbflute.exbhv.UsersBhv;
>  import sampleproject.dbflute.exdao.pmbean.SimpleselectUserdetailspmb;
>  import sampleproject.dbflute.exentity.Userdetails;
>  import sampleproject.dbflute.exentity.Users;
>  import sampleproject.dbflute.exentity.customize.SimpleUserdetails;
>  import sampleproject.web.test.CommonText;
>
>  public class RegisterPage {
>         public String uid;
>         public String name;
>         public String add;
>         public String email;
>         public LabelHelper lp;
>         public String passid;
>         public String userexistmsg;
>         public UsersBhv usersBhv;
>         public UserdetailsBhv userdetailsBhv;
>
>         /**
>          * id登録処理
>          * @return class
>          */
>         public Class doSave() {
>                 boolean userchk;
>                 userchk = usercheck();
>
>
>                 if (userchk){
>                         userexistmsg = lp.getLabelValue("userexist");
>                         return null;
>                 }
>                 else
>                 {
>                         insert();
>                         return LoginPage.class;
>                 }
>         }
>
>         /**
>          * id重複チェック
>          * @return boolean
>          */
>
>         public boolean usercheck(){
>                 final Class<SimpleUserdetails> entityType = SimpleUserdetails.class;
>                 final SimpleselectUserdetailspmb pmb = new SimpleselectUserdetailspmb();
>
>                 pmb.setUserid(uid);
>
>                 System.out.println(userdetailsBhv + "null check!");
>                 final List<SimpleUserdetails> resultList =  userdetailsBhv.outsideSql().selectList(CommonT
>  ext.SELECTUSERDETAILSPATH,pmb, entityType);
>                 if (resultList.size() > 0){
>                         return true;
>                 }
>                 else{
>                         return false;
>                 }
>
>         }
>         public void initialize() {
>         }
>
>         public void prerender() {
>         }
>  }
>
>  問題の部分
>  テストクラスの
>  Class result = registerPage.doSave();   部分でnullPointException
>  テスト対象クラスの
>
>  final List<SimpleUserdetails> resultList =  userdetailsBhv.outsideSql().selectList(CommonTex
>  t.SELECTUSERDETAILSPATH,pmb, entityType);
>  部分のuserdetailsBhvがテストの時だけnullになる。
>
>  解消する方法をしてる方、お答えお願いいたします。
>
>  _______________________________________________
>  Seasar-user mailing list
>  [E-MAIL ADDRESS DELETED]
>  https://ml.seasar.org/mailman/listinfo/seasar-user
>


Seasar-user メーリングリストの案内