このAnswerの重複をマークする前に、その答えが私の問題を解決しないことを理解してください。答えは現在の方法でwhen()
を使用する解決方法を示します。私の問題では、UserDao
が初期化されています。テスト中のメソッドとモックされたオブジェクトの内部をどこに渡すことはできません。MyBatisで初期化されたインターフェースの参照をモックする方法は?
MyBatisによって初期化されるインターフェイスの参照があります。オブジェクトがテストの対象に渡されないため、テストで直接模擬することはできません。私はコンストラクタを嘲笑してPowerMockする必要があります。インターフェイスを呼び出すコンストラクタは存在しないため、PowerMockは例外をスローします。ここで
java.lang.ArrayIndexOutOfBoundsException: 0
at org.powermock.api.mockito.internal.expectation.AbstractConstructorExpectationSetup.withAnyArguments(AbstractConstructorExpectationSetup.java:100)
コードは、私がPowerMockせずにプログラムを実行すると、実際のデータベースにアクセスし、正しい結果を返している
class UserServiceTest{
@AutoWired
UserService userService;
@Mock
UserDao userDao;//This is a reference to the interface (UserDao) which is mapped using MyBatis
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
//The Program fails at the below statement
PowerMockito.whenNew(UserDao.class).withAnyArguments().thenReturn(userDao);
@Test
public void testFetchDetails() throws Exception {
when(userDao.fetchDetails(any(ParameterOne.class)).thenReturn(null);
assertThat(userService.fetchDetails(new ParameterOne())).isNull();
}
}
どのように見えるかです。また、データベースにアクセスすると、Testのランタイムが500msまで遅くなります。
UserDao userDao
をどうすればよいですか?私がこのような場合に単体テストを行う方法を嘲笑することができなければ。テストしているコードを変更することはできません。
P.S. PowerMockの使用を避けるよう提案している場合は、この状況で「より良い」代替案を提案してください。
P.P.S私は、Daoレイヤーを使用するサービスではなく、Daoレイヤーをテストしていないので、サービスの動作が正しいかどうかをDaoLayerで調べる必要があります。
あなたのテストの完全なコードですか? [docs](https://github.com/powermock/powermock/wiki/MockConstructor)に従って、テストに '@RunWith(PowerMockRunner.class)'と '@PrepareForTest(ClassThatCreatesTheNewInstance.class)'を注釈を付けるべきです。 。 – Morfic