Java 在Mockito中模仿一把刀

Java 在Mockito中模仿一把刀,java,unit-testing,intellij-idea,mockito,Java,Unit Testing,Intellij Idea,Mockito,我刚刚开始测试代码。我以前做过单元测试,但并没有真正将它们隔离开来。所以它们更像是集成测试(间接)。我想尝试一下Mockito,我已经将它添加到我的Intellij IDE中。 但我根本不知道如何真正实现模仿。他们的网站上有一些例子,但我就是无法理解嘲弄的概念。我知道有人使用模拟来隔离单元测试,以确保错误在单元本身而不是依赖项中 我写了以下内容: @Test public void testChangeMemberReturnsTrue() throws Exception { Memb

我刚刚开始测试代码。我以前做过单元测试,但并没有真正将它们隔离开来。所以它们更像是集成测试(间接)。我想尝试一下Mockito,我已经将它添加到我的Intellij IDE中。 但我根本不知道如何真正实现模仿。他们的网站上有一些例子,但我就是无法理解嘲弄的概念。我知道有人使用模拟来隔离单元测试,以确保错误在单元本身而不是依赖项中

我写了以下内容:

@Test
public void testChangeMemberReturnsTrue() throws Exception {
    Member tempMem = new Member();
    tempMem.setMemberFirstName("Swagrid");
    tempMem.setMemberLastName("McLovin");
    tempMem.setMemberID("SM666");

    SQLDUMMY.saveMember(tempMem);               //Save member to dummy DB.

    Member checkMem = new Member();
    ArrayList<Member> memArr = SQLDUMMY.getAllMembers();
    for (Member m : memArr) {                   // Look through all saved members
        if (m.equals(tempMem)) {                // If match, save to checkMem
            checkMem = m;
        }
    }
    assertTrue(tempMem.equals(checkMem));            // Make sure they are really equal.

    String newfirstname = "Darius";
    String newlastname = "DunkMaster";
    assertTrue(memhandling.changeMember(tempMem, newfirstname, newlastname));

}
@测试
public void testChangeMemberReturnsTrue()引发异常{
成员tempMem=新成员();
tempMem.setMemberFirstName(“Swagrid”);
tempMem.setMemberLastName(“McLovin”);
tempMem.setMemberID(“SM666”);
SQLDUMMY.saveMember(tempMem);//将成员保存到虚拟数据库。
成员checkMem=新成员();
ArrayList memArr=SQLDUMMY.getAllMembers();
对于(成员m:memArr){//查看所有保存的成员
如果(m.equals(tempMem)){//如果匹配,则保存到checkMem
checkMem=m;
}
}
assertTrue(tempMem.equals(checkMem));//确保它们确实相等。
字符串newfirstname=“Darius”;
字符串newlastname=“DunkMaster”;
assertTrue(memhandling.changember(tempMem、newfirstname、newlastname));
}
下面是实际的方法:

public boolean changeMember(Member mem, String n1, String n2) {
    try {
        ArrayList<Member> memArr = SQLDUMMY.getAllMembers();
        for (Member m : memArr) {
            if (m.equals(mem)) {
                m.setMemberFirstName(n1);
                m.setMemberLastName(n2);
                m.setMemberID(ensureUniqueID(m, m.getMemberID())); //Just a method call to another method in the same class to ensure ID uniqueness.
                return true;
            }
            else {
                return false;
            }
        }
    }
    catch (Exception e) {
        System.out.println("Error4.");
    }
    return false;
}
public boolean changember(成员mem,字符串n1,字符串n2){
试一试{
ArrayList memArr=SQLDUMMY.getAllMembers();
代表(成员m:memArr){
如果(m等于(mem)){
m、 setMemberFirstName(n1);
m、 setMemberLastName(n2);
m、 setMemberID(ensureUniqueID(m,m.getMemberID());//只需对同一类中的另一个方法进行方法调用即可确保ID的唯一性。
返回true;
}
否则{
返回false;
}
}
}
捕获(例外e){
System.out.println(“Error4”);
}
返回false;
}
我想模拟SQLDUMMY(我创建SQLDUMMY只是为了看看我的测试是否会通过,它们会通过。)SQLDUMMY类如下所示:

public class SQLDUMMY {

private static ArrayList<Member> memberList = new ArrayList<>();
private static ArrayList<Ship> shipList = new ArrayList<>();

public static ArrayList<Member> getAllMembers() {
    return memberList;
}

public static void saveMember(Member m) {
    memberList.add(m);
}

public static void deleteMember(Member memIn) {
    memberList.remove(memIn);
}


public static void saveShip(Ship newShip) {
    shipList.add(newShip);
}

public static ArrayList<Ship> getAllShips() {
    return shipList;
}

public static void deleteShip(Ship s) {
    shipList.remove(s);
}
公共类SQLDUMMY{
私有静态ArrayList成员列表=新ArrayList();
私有静态ArrayList shipList=新ArrayList();
公共静态ArrayList getAllMembers(){
返回成员列表;
}
公共静态void saveMember(成员m){
成员名单。添加(m);
}
公共静态无效删除成员(成员memIn){
成员列表。删除(memIn);
}
公共静态无效保存(船舶新闻){
发货清单。添加(新闻);
}
公共静态数组列表getAllShips(){
返回船单;
}
公共船舶(s船){
发货清单。删除;
}
}

它基本上只是由作为当代数据库存储的ArrayList的getter和add/remove组成

小结:如何模拟SQLDUMMY类(DAO),使其不再是单元测试的依赖项?

您需要了解其工作原理。 其基本思想是,它扩展类并覆盖所有方法,并允许您随时返回所需的内容

语法是:

SQLDummy sqlDummy = Mockito.mock(SQLDummy.class);
Mockito.when(sqlDummy.getAllShips()).thenReturn(new ArrayList< Ship >())
SQLDummy-SQLDummy=Mockito.mock(SQLDummy.class);
Mockito.when(sqlDummy.getAllShips()).thenReturn(newarraylist())
您需要阅读工作原理。 其基本思想是,它扩展类并覆盖所有方法,并允许您随时返回所需的内容

语法是:

SQLDummy sqlDummy = Mockito.mock(SQLDummy.class);
Mockito.when(sqlDummy.getAllShips()).thenReturn(new ArrayList< Ship >())
SQLDummy-SQLDummy=Mockito.mock(SQLDummy.class);
Mockito.when(sqlDummy.getAllShips()).thenReturn(newarraylist())

很好的例子。我还推荐Mockito javadoc,它在概述中有一个很棒的教程:绝对精彩!我现在明白了。我不明白实例化一个已经存在的类并调用它并返回一个期望值是什么意思。现在我明白他们的意思了。(当你有一个与你的问题相关的例子时,这很简单。)再次感谢@Stackflow,嗨,我也在尝试同样的方法,但是真正的刀并没有被模拟的刀所取代。即使在我模仿Dao对象之后,它实际上也会通过真正的Dao。知道为什么会这样吗?我正在使用SpringJUnit4ClassRunner、WebAppConfiguration ContextConfiguration来配置测试类。@KayKay您必须检查您的类绑定器。。。确保为正确的环境注入类。就像测试应该测试类和产品一样,你应该真正实现它。很好的例子。我还推荐Mockito javadoc,它在概述中有一个很棒的教程:绝对精彩!我现在明白了。我不明白实例化一个已经存在的类并调用它并返回一个期望值是什么意思。现在我明白他们的意思了。(当你有一个与你的问题相关的例子时,这很简单。)再次感谢@Stackflow,嗨,我也在尝试同样的方法,但是真正的刀并没有被模拟的刀所取代。即使在我模仿Dao对象之后,它实际上也会通过真正的Dao。知道为什么会这样吗?我正在使用SpringJUnit4ClassRunner、WebAppConfiguration ContextConfiguration来配置测试类。@KayKay您必须检查您的类绑定器。。。确保为正确的环境注入类。就像测试应该测试类和产品一样,您应该真正实现它。