2

Junit とともに Spring Test フレームワークを使用しています。テストケースに使用するSpringコンテキストファイルがあります:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:spring/restTestContext.xml",
        "classpath:spring/webserviceContext.xml" })
@PrepareForTest(User.class)
public class RestTestsIT {

// This is a mock
@Autowired private AWSMailService mailService;
...
}

restTestContext.xml 内で、タイプ AWSMailService の Bean を作成しています (これは実際にはモックです)。

<bean id="mailService" name="mailService" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.acme.utils.email.AWSMailService" />
</bean>

テスト内で sendEmail() メソッドが mailService モックで呼び出されたことを確認しようとしていますが、オブジェクトで toString() を呼び出すと、それがモックであることがわかりますが、NotAMockException が発生します。

public void testEmailSent() {
...
// Results in "Mock for AWSMailService, hashCode: 31777764"
System.out.println(mailService.toString());

// Results in NotAMockException
verify(mailService).sendEmail(any(String.class), ...);
}

これを引き起こしている可能性のあるアイデアはありますか?

ありがとう

4

3 に答える 3

1

私は同じ問題を抱えていました.mockito 1.8.1を使用していましたが、バージョン1.9.0では問題が修正されました.

Mockito の有効なモック アルゴリズムが変更され、Spring プロキシ Bean と競合しなくなりました。

于 2012-05-09T09:50:35.867 に答える
1

Spring はこのオブジェクトのプロキシを作成しているので、Mockito はそれがモックではないと判断します。これは、呼び出し元とモック オブジェクトの間の中間として Proxy$34 クラスを取得しているためですか?

于 2012-04-25T14:44:06.717 に答える
0

修正しました:)

問題は、Mockito が実際に Mock を作成していたが、Spring がそれをプロキシしていたため、Mockito はモックの周りにプロキシがあることを理解できるほど知的ではないことでした。

現在、単体テストでモックを手動で作成し、それらを配線しています。

@Mock private AWSMailService mailService;
@Autowired private UserService userService;

@Before
public void setup() {
  ((UserServiceImpl) userService).setMailService(mailService);
}
于 2012-04-27T11:53:11.640 に答える