这可能是一个简单的问题,但我无法让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?
答案 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)
,看看是否有任何区别。