3

我需要测试一个服务类,但是当我尝试模拟 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

4 回答 4

3

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

Also when you tried later to supply new Test() as the argument to match, it will literally try to match on that exact instance of Test, but presumably your real code is new-ing up a different one. So the use of Matchers.any(Test.class) as the parameter to match is the way to go.

于 2012-04-09T20:07:49.737 回答
2

Mockito 注入机制不知道 Spring @Autowired 或 CDI @Inject 注释。它只是尝试根据模拟的类型和名称找到最佳候选者,并且它也可以查找私有字段。请参阅 @InjectMocks 的 javadoc:http: //docs.mockito.googlecode.com/hg/1.9.0/org/mockito/InjectMocks.html

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

你确定test变量 inregTest.regTest(int...)真的是null传递给testDao.createObject(test)吗?

于 2012-04-09T16:59:31.227 回答
1

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

于 2012-04-09T14:49:02.633 回答
0

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

于 2012-04-09T14:27:11.263 回答