首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Mockito的when()没有被触发?

为什么Mockito的when()没有被触发?
EN

Stack Overflow用户
提问于 2012-04-09 21:17:08
回答 4查看 2.7K关注 0票数 3

我需要测试一个服务类,但是当我试图模拟dao类时,它不会被触发,因此不能使用ThenReturn()。

我认为这个问题是因为我在服务类(Spring MVC 3.1)中为我的Dao使用了一个接口并使用了@Autowired:

接口:

代码语言:javascript
复制
public interface TestDao {
    int createObject(Test test) throws NamingException;
}

实现:

代码语言:javascript
复制
@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();
    }
}

服务:

代码语言:javascript
复制
public class RegTest {
    @Autowired
    TestDao testDao;

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

在测试中,我有:

代码语言:javascript
复制
@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()的测试对象不匹配。使用

代码语言:javascript
复制
testDao.createObject(any(Test.class))

成功了!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-04-10 04:07:50

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-04-10 00:59:31

Mockito注入机制不知道Spring @Autowired或CDI @Inject注解。它只是试图在给定mock的类型和名称的情况下找到最好的候选者,并且它还可以查找私有字段。请参阅@InjectMock:http://docs.mockito.googlecode.com/hg/1.9.0/org/mockito/InjectMocks.html的javadoc

您使用的语义是正确的,但是如果您遇到问题,我宁愿寻找不正确的交互或不正确的参数。

您确定regTest.regTest(int...)中的test变量在传递给testDao.createObject(test)时真的是null吗?

票数 2
EN

Stack Overflow用户

发布于 2012-04-09 22:49:03

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10073778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档