Mockito为什么不在()被触发时?

时间:2012-04-09 13:17:08

标签: spring unit-testing mocking mockito

我需要测试一个服务类,但是当我尝试模拟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)返回0(由于被模拟)而不是100,因为我试图实现。

有人可以帮忙吗?

问题解决了!

传递的测试对象与createObject()不匹配。使用

testDao.createObject(any(Test.class))

做了伎俩!

4 个答案:

答案 0 :(得分:3)

如果您的测试实际上是将值传递给createObject,那么when(testDao.createObject(null) ...永远不会匹配。您可以将Test的任何实例与testDao.createObject(any(Test.class)) ...

匹配,而不是匹配null

此外,当您稍后尝试提供new Test()作为匹配的参数时,它会真正尝试匹配Test的确切实例,但可能您的真实代码正在新建一个不同的一。因此,使用Matchers.any(Test.class)作为匹配参数是可行的方法。

答案 1 :(得分: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...)中的null变量是否真的testDao.createObject(test)

答案 2 :(得分:1)

我不知道这是否是示例中的拼写错误,但您RegTest.regTest()呼叫createTest()而不是createObject()。否则,我不认为@Autowired与它有任何关系,因为你的测试本身并不是在带有Spring管理的容器中运行。如果它不是拼写错误,并且createTest实际上是createObject的真实且不同的方法,那么Mockito中模拟对象的默认行为是返回数字返回类型的适当类型的零

答案 3 :(得分:0)

我认为你没有被召唤的自动装置是正确的。您可以使用setTestDao()调用自己注入dao。 Mockito还支持spy,它允许您跟踪对象代码,而只是替换函数。