[Seasar-user:13913] Re: [Dbflute] Junitテストの時Bhvがnullになります。
Yuu
[E-MAIL ADDRESS DELETED]
2008年 4月 24日 (木) 12:43:46 JST
久保様、
ありがとうございます!!
解決できました。
本当にありがとうございます。
----- Original Message -----
送信者: kubo<[E-MAIL ADDRESS DELETED]>
宛先: [E-MAIL ADDRESS DELETED]
日付:Thursday, April, 24, 2008, 12:02 PM
件名: [Seasar-user:13912] Re:[Dbflute] Junitテストの時Bhvが=?utf-8?b?bnVsbOOBq+OBquOCiuOBvuO
BmeOAgg==?=
>
>
> 久保です。
>
> 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(Comm
onTex
> > t.SELECTUSERDETAILSPATH,pmb, entityType);
> > 部分のuserdetailsBhvがテストの時だけnullになる。
> >
> > 解消する方法をしてる方、お答えお願いいたします。
> >
> > _______________________________________________
> > Seasar-user mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-user
> >
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user
>
Seasar-user メーリングリストの案内