Mockito:AssertionError期望True但是给出False

时间:2017-07-09 14:51:41

标签: java junit boolean mockito

似乎当两个f.isColored() && fm.isColored()在一起时,该方法返回false,但如果我单独使用它们,则该方法返回true。

此方法0未通过测试

 @Override
    public boolean colorConstraint(ActionSpace as, FamilyMember fm) {
        for (FamilyMember f : as.getFamilyMembers()) {
            if (true && f.isColored() && fm.isColored()) //this does not work
                return false;
        }
        return true;
    }

测试通过此方法1

@Override
    public boolean colorConstraint(ActionSpace as, FamilyMember fm) {
        for (FamilyMember f : as.getFamilyMembers()) {
            if (true && false && fm.isColored())
                return false;
        }
        return true;
    }

测试通过此方法2

@Override
public boolean colorConstraint(ActionSpace as, FamilyMember fm) {
    for (FamilyMember f : as.getFamilyMembers()) {
        if (true && f.isColored() && true)
            return false;
    }
    return true;
}

测试方法

 @Test
    public void neutralFMInASAndSameOwner() {
        //given
        List<FamilyMember> familyMemberList;
        familyMemberList = Arrays.asList(fm);
        when(as.getFamilyMembers()).thenReturn(familyMemberList);

/*this is commented when using method 1 */
        //family member in action space is neutral
        when(familyMemberList.get(0).isColored()).thenReturn(false);

/*this is commented when using method 2 */
        //fm to place is colored
        when(fm.isColored()).thenReturn(true);
        //when
        Boolean bool;
        bool = harvestProductionASController.colorConstraint(as, fm);
        //then
        assertTrue(bool); //AssertionError when using method 0
    }

1 个答案:

答案 0 :(得分:0)

 List<FamilyMember> familyMemberList;
 familyMemberList = Arrays.asList(fm);
 when(as.getFamilyMembers()).thenReturn(familyMemberList);

/*this is commented when using method 1 */
 //family member in action space is neutral
 when(familyMemberList.get(0).isColored()).thenReturn(false);

where is familyMemberList.get(0)它是fm,它与

相同
when(fm.isColored()).thenReturn(false);

当您将zero元素fm添加到familyMemberList

所以在你的代码中是:

when(fm.isColored())。thenReturn(false); - 第一次调用返回false 当(fm.isColored())thenReturn(真)。 - 对于第二次调用返回true

fm - 它是模拟对象,对于模拟对象mockito可以这样工作:如果第一次调用方法然后返回X,如果第二次调用方法然后返回Y ..... 你的情况是你应用了这种行为。

方法colorConstraint中的

if (f.isColored() && fm.isColored()) //this does not work
   return false;

f.isColored()有值 - false fm.isColored()有结果 - true

因此,对于您的测试,此方法的结果是错误的。

修复:(不要使用相同的对象)

 List<FamilyMember> familyMemberList;
 FamilyMember fmNew= new ();
 familyMemberList = Arrays.asList(fmNew);

只是说:

变化 if(true&amp;&amp; f.isColored()&amp;&amp; fm.isColored()) - &gt;(f.isColored()&amp;&amp; fm.isColored())

if(true&amp;&amp; false&amp;&amp; fm.isColored()) - &gt; if(!fm.isColored())

if(true&amp;&amp; f.isColored()&amp;&amp; true) - &gt; if(f.isColored())