[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 メーリングリストの案内