Dropwizard DAO mock mockito



这可能是一个简单的问题,但我无法让 Dao Mocks 工作。

import com.feetme.backend.jdbi.IRecordDAO;
import com.feetme.backend.representations.Record;
import io.dropwizard.testing.junit.ResourceTestRule;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class BasicResourceTest {

private static final IRecordDAO dao = mock(IRecordDAO.class);
private final Record record = getDummyRecord();
@ClassRule
public static final ResourceTestRule resources = ResourceTestRule.builder()
        .addResource(new BasicResource(dao))
        .build();
private static Record getDummyRecord(){
    Record rec = new Record();
    rec.setId(10);
    return rec;
}

@Before
public void setup() {
    when(dao.findRecordById(eq(10))).thenReturn(record);
    reset(dao);
}
@Test
public void testGetId_Patient() {
    Record r = dao.findRecordById(10);
    assertThat(r).isEqualTo(record);
    assert(r.getId() == 10)
}

在这种情况下,我的两个断言都永远不行。

我还尝试将重置调用放入@After方法中。同样的问题。

我的 IRecordDAO 方法通常只是在数据库中获取一条记录。

我可能错过了一些明显的东西。

任何帮助将不胜感激。

这里是 DAO 接口。

@RegisterMapper(RecordMapper.class)
public interface IRecordDAO {
@SqlQuery("sql query ...")
Record findRecordById(@Bind("id") long id);

/**
 * close with no args is used to close the connection
 */
void close();

编辑:实际上问题似乎与eq()方法有关。当我用不需要任何参数的 dao 方法做类似的事情时,我没有任何问题。

当我用 anyInt() 替换 eq(10) 时,它工作正常。我想我现在会没事的,但仍然欢迎任何线索。

最后,将 eq(10) 替换为 10 可以正常工作。那么应该如何使用情商呢?

不要reset(dao) setup()方法。这会导致模拟道忘记您之前配置的存根。请参阅有关重置模拟的 Mockito 文档。

根据eq的java文档

public static <T> T eq(T value)
Object argument that is equal to the given value.

它用于对象,而 10 是 int,这是一个基元类型。您可以尝试使用 new Integer(10) ,只是为了看看这是否有任何区别。

最新更新