java - 如何模拟 DataSourceTransactionManager ?

标签 java unit-testing junit mockito

我有以下我想模拟的代码。我基本上对模拟 DataSourceTransactionManager 感兴趣。

    @Autowired
    @Qualifier("nesTransactionManager")
    DataSourceTransactionManager mDataSourceTransactionManager;

   ...............................

    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
       TransactionStatus status = mDataSourceTransactionManager.getTransaction(def);

       try {
          <-doing some DB operations here>
          mDataSourceTransactionManager.commit(status);
       } catch (Exception e) {
          mDataSourceTransactionManager.rollback(status);
       }
.............

到目前为止我已经尝试过:

    @Mock
    private DataSourceTransactionManager mDataSourceTransactionManager;

   @Before
    public void runBeforeEachTest() {
        when(mDataSourceTransactionManager.getTransaction(any(DefaultTransactionDefinition.class))).thenReturn(null);
        doNothing().when(mDataSourceTransactionManager).commit(any(TransactionStatus.class));
        doNothing().when(mDataSourceTransactionManager).rollback(any(TransactionStatus.class));
}

还有这个:

    @Mock
    private DataSourceTransactionManager mDataSourceTransactionManager;

   @Before
    public void runBeforeEachTest() {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

        when(mDataSourceTransactionManager.getTransaction(eq(def))).thenReturn(null);
        doNothing().when(mDataSourceTransactionManager).commit(any(TransactionStatus.class));
        doNothing().when(mDataSourceTransactionManager).rollback(any(TransactionStatus.class));

但我总是遇到这个错误:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
0 matchers expected, 1 recorded:
-> at com.nuance.entrd.mc.nes.jobs.JobPollerTest.runBeforeEachTest(JobPollerTest.java:43)

This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

For more info see javadoc for Matchers class.

    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:337)

在此上下文中没有任何意义的错误。知道如何解决这个问题吗?

谢谢

最佳答案

我解决问题的方法是使用 PowerMokito :

@RunWith(PowerMockRunner.class)
@PrepareForTest({DataSourceTransactionManager.class})
public class JobPollerTest {
.....................
 private DataSourceTransactionManager mDataSourceTransactionManager;
......................

    mDataSourceTransactionManager = PowerMockito.mock(DataSourceTransactionManager.class);

     DefaultTransactionDefinition def = new DefaultTransactionDefinition();
            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

            Mockito.when(mDataSourceTransactionManager.getTransaction(def)).thenReturn(null);

关于java - 如何模拟 DataSourceTransactionManager ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31807920/

相关文章:

java - 使用 Sax 解析大型 XML 文件

java - Gradle:仅在给出特定参数时运行测试

java - 为什么在 Jenkins 部署期间 JUnit 测试会在中午 12 点到 1 点之间失败?

java - 在进程内实现独立通信

java - 除非用常量表达式初始化,否则不能在非静态内部类型中将字段声明为静态

unit-testing - 强制 nunit 控制台运行程序使用 CLR 4.5

java - 如何让 JUnit 4.8 在测试失败后但在任何 @After 方法之前运行代码?

java - assert(false) 不会停止执行

java - Eclipse 无法编译成 bin,无法找到或加载主类

C# 单元测试解析器