Dropwizard DAO模拟mockito

时间:2015-01-13 18:25:27

标签: java testing mockito dao dropwizard

这可能是一个简单的问题,但我无法让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方法通常只是在DB中提取记录。

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

任何帮助都将不胜感激。

这里是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)时,它工作正常。我想我现在可以接受它,但任何线索仍然是受欢迎的。

最后,用10代替eq(10)可以正常工作。那么应该如何使用eq?

2 个答案:

答案 0 :(得分:0)

reset(dao)方法中不要setup()。这导致模拟dao忘记了之前配置的存根。请参阅Mockito documentation on resetting mocks

答案 1 :(得分:0)

根据eq的java doc

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

是对象,而10是int,它是一种原始类型。您可以尝试使用new Integer(10),看看是否有任何区别。