3

サービス クラスをテストする必要がありますが、dao クラスをモックしようとすると、トリガーされないため、ThenReturn() を使用できません。

問題は、サービス クラス (Spring MVC 3.1) で Dao と @Autowired のインターフェイスを使用しているためだと思います。

インターフェース:

public interface TestDao {
    int createObject(Test test) throws NamingException;
}

実装:

@Repository
public class TestDaoImpl implements TestDao {

    @Override
    public int createObject(Test test) {
        KeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(new InsertNewTest(test), keyHolder);
        return ((java.math.BigDecimal)keyHolder.getKey()).intValue();
    }
}

サービス:

public class RegTest {
    @Autowired
    TestDao testDao;

    public int regTest(int .....) {
        .
        .
        int cabotageId = testDao.createObject(test);
    }
}

私が持っているテストでは:

@RunWith(MockitoJUnitRunner.class)
public class TestRegService {
    @InjectMocks
    private RegTest regTest = new RegTest();

    @Mock
    TestDao testDao;

    @Test()
    public void test() {
        .
        when(testDao.createObject(null)).thenReturn(100);
        .
    }

testDao.createObject(null) は、私が達成しようとしているように、100 ではなく 0 (モックされているため) を返します。

誰か助けてくれませんか?

問題が解決しました!

一致しなかったのは、createObject() に渡すテスト オブジェクトでした。使用する

testDao.createObject(any(Test.class))

トリックをしました!

4

4 に答える 4

3

テストが実際にcreateObjectに値を渡している場合、when(testDao.createObject(null)...は一致しません。nullで照合するのではなく、...の任意のインスタンスTestを照合できます。testDao.createObject(any(Test.class))

また、後でnew Test()一致する引数として指定しようとすると、文字通り、の正確なインスタンスで一致しようとしますがTest、おそらく実際のコードは新しいものです-別のコードを作成します。したがって、Matchers.any(Test.class)一致するパラメータとしてを使用するのが最善の方法です。

于 2012-04-09T20:07:49.737 に答える
2

Mockitoインジェクションメカニズムは、Spring@AutowiredまたはCDI@Injectアノテーションについて認識していません。モックのタイプと名前を指定して最適な候補を見つけようとするだけで、プライベートフィールドも検索できます。@InjectMocksのjavadocを参照してください:http://docs.mockito.googlecode.com/hg/1.9.0/org/mockito/InjectMocks.html

使用しているセマンティクスは正しいですが、問題が発生している場合は、誤った相互作用または誤った引数を探します。

testの変数がに渡されたときにregTest.regTest(int...)本当にあると確信していますか?nulltestDao.createObject(test)

于 2012-04-09T16:59:31.227 に答える
0

オートワイヤーが呼び出されないことについては正しいと思います。代わりに setTestDao() 呼び出しを使用して自分で dao を注入できます。Mockito はspyもサポートしています。これにより、オブジェクト コードをトレースし、代わりに関数を置き換えることができます。

于 2012-04-09T14:27:11.263 に答える