0

mockitoとjunitを使用して次のテストを実行しようとしていますが、「java.lang.NullPointerException:name must not null」が発生し続けます。なぜこれが発生するのか、誰か教えてもらえますか?

デバッグ時に、テストがisStopValid(String)メソッドで次のステートメントを実行すると、この例外がスローされることがわかりました。

FacilityValidationUtil facUtil = new FacilityValidationUtil();

@RunWith(MockitoJUnitRunner.class)
public class MyFormTest{
    @InjectMocks MyForm form = new MyForm();
    @Mock FacilityValidationUtil facUtil;
    @Test
    public void testIsStopValid() throws FinderException{
        when(facUtil.isFacilityValid("")).thenReturn(false);
        form.setOrigin("");
        assertEquals(false, form.isStopValid(form.getOrigin()));        
    }
}

テストするメソッドを持つクラス:

public class MyForm{
    FacilityValidationUtil facUtil = new FacilityValidationUtil();
    public boolean isStopValid(String stop){

        try {
            return facUtil.isFacilityValid(stop);
        } catch (FinderException e) {
            log.error("Error finding the stop. "+e.getCause());
            return false;
        }
    }
}

public class FacilityValidationUtil{
    private FacilityDAO facilityDao = new HibernateFacilityDAO();
    public boolean isFacilityValid(String facility) throws FinderException{
        boolean test;
        FacilityImpl facilityImpl = facilityDao.findFacilityByNassCode(facility);
        test = (facilityImpl==null)?false : true;
        return test;
    }
}

public class HibernateFacilityDAO extends HibernateAbstractDeltaDAO implements FacilityDAO {
    public HibernateFacilityDAO() {
        super(false);
    }
}
4

1 に答える 1

2

簡単な回答:isStopValidメソッドのローカルである変数(facUtil)をモックしようとしているため、毎回「更新」しているため、テストでこのオブジェクトのモックバージョンが呼び出されることはありません。

長い回答:FacilityValidationUtilクラスへの呼び出しをモックしようとしているようです。その場合は、クラスをフィールドにして、Mockitoがオブジェクトをリフレクションで注入できるようにする必要があります(このオブジェクトがスレッドの場合)安全であるように見えます)または、コンストラクターをモックできるPowerMockitoのようなモックフレームワークを探索します(新しい場合はPowerMockitoのグーグル)。

PowerMockito.whenNew(FacilityValidationUtil.class).withNoArguments().thenReturn(facUtil);

Mockitoは、デフォルトでコンストラクター引数のモックをサポートしていません。

編集 それでも問題が解決しない場合は、小さな例から始めることをお勧めします。テストしようとしているコードを使用して機能するものをまとめました(ただし、Mockitoにはいくつかの奇妙なルールがありますが、例を圧縮するためにそれを行っています)。

@RunWith(MockitoJUnitRunner.class)
public class MyFormTest {

    @InjectMocks
    private MyForm form = new MyForm();
    @Mock
    private FacilityValidationUtil facUtil;

    @Test
    public void testIsStopValid_false() {
        when(facUtil.isFacilityValid("")).thenReturn(false);
        assertEquals(false, form.isStopValid(""));
    }

    @Test
    public void testIsStopValid_true() {
        when(facUtil.isFacilityValid("")).thenReturn(true);
        assertEquals(true, form.isStopValid(""));
    }

    public class MyForm {
        private FacilityValidationUtil facUtil = new FacilityValidationUtil();

        public boolean isStopValid(String stop) {
            try {
                return facUtil.isFacilityValid(stop);
            } catch (FinderException e) {
                return false;
            }
        }
    }

    public class FacilityValidationUtil {
        public boolean isFacilityValid(String facility) throws FinderException {
            throw new RuntimeException(facility);
        }
    }

    public class FinderException extends RuntimeException {
        public FinderException(String message) {
            super(message);
        }
    }

}

本当に重要なのは、モックが正しく注入されていないことです。それが解決されるまで、同じエラーが発生し続けます。myFormで、facUtil.isFaciltyValidを呼び出してオブジェクトを確認する時点で、ブレークポイントを設定します。クラスではなく、mockitoオブジェクトである必要があります。

幸運を。

于 2013-03-11T17:59:29.587 に答える