JMockit - Expectations vs MockUp<T> 为什么一个有效而另一个无效?
JMockit - Expectations vs MockUp<T> Why does one work and the other doesn't?
我正在尝试(仍然)学习 JMockit 的来龙去脉。这是另一个我不明白的 JMockit 怪癖示例。 运行 使用 NonStrictExpectations 的测试工作正常。但是,运行 MockUp 没有。我不确定为什么。有任何想法吗?我是 运行 JMockit 1.5.
测试方法:
private List<Foo> getFooList(List<FooStatement> fooStatements){
List<Foo> FooList = new ArrayList<Foo>();
for(FooStatement at: fooStatements){
List<Foo> aList = at.getFoos();
FooList.addAll(aList);
}
return FooList;
}
成功的期望测试
@Test
public void getFooListWithExpectationsTest(
@Mocked final FooStatement mockFooStatement,
@Mocked final Foo mockFoo
){
List<FooStatement> fooStatementList = new ArrayList<>(Arrays.asList(
mockFooStatement,
mockFooStatement
));
new NonStrictExpectations(){{
mockFooStatement.getFoos();
result = new ArrayList<Foo>(Arrays.asList(mockFoo));
}};
List<Foo> fooList = Deencapsulation.invoke(handler, "getFooList", fooStatementList);
Assert.assertTrue(fooList.size() == 2);
}
MockUp 断言错误 (0 != 2)
@Test
public void getFooListWithMockUpTest(
@Mocked final FooStatement mockFooStatement,
@Mocked final Foo mockFoo
){
new MockUp<FooStatement>(){
@Mock
public List<Foo> getFoos(){
return new ArrayList<Foo>(Arrays.asList(mockFoo));
}
};
List<FooStatement> fooStatementList = new ArrayList<>(Arrays.asList(
mockFooStatement,
mockFooStatement
));
List<Foo> fooList = Deencapsulation.invoke(handler, "getFooList", fooStatementList);
Assert.assertTrue(fooList.size() == 2);
}
您使用的 MockUp<?>
不正确。 MockUp<T?
将告诉 JMockit 重新定义一个 classes 加载到 JVM,这样就不会真正 class 初始化 FooStatement
,它会用 class 中定义的替换它们。 =14=].
所以基本上 MockUp<FooStatement>
会自动替换 new FooStatement()
的调用。
试试这样的:
@Test
public void getFooListWithMockUpTest(@Mocked final Foo mockFoo){
new MockUp<FooStatement>(){
@Mock
public List<Foo> getFoos(){
return new ArrayList<Foo>(Arrays.asList(mockFoo));
}
};
List<FooStatement> fooStatementList = new ArrayList<>(Arrays.asList(
new FooStatement(),
new FooStatement()
));
List<Foo> fooList = Deencapsulation.invoke(handler, "getFooList", fooStatementList);
Assert.assertTrue(fooList.size() == 2);
}
MockUp 已弃用,请使用 Expectations
我正在尝试(仍然)学习 JMockit 的来龙去脉。这是另一个我不明白的 JMockit 怪癖示例。 运行 使用 NonStrictExpectations 的测试工作正常。但是,运行 MockUp 没有。我不确定为什么。有任何想法吗?我是 运行 JMockit 1.5.
测试方法:
private List<Foo> getFooList(List<FooStatement> fooStatements){
List<Foo> FooList = new ArrayList<Foo>();
for(FooStatement at: fooStatements){
List<Foo> aList = at.getFoos();
FooList.addAll(aList);
}
return FooList;
}
成功的期望测试
@Test
public void getFooListWithExpectationsTest(
@Mocked final FooStatement mockFooStatement,
@Mocked final Foo mockFoo
){
List<FooStatement> fooStatementList = new ArrayList<>(Arrays.asList(
mockFooStatement,
mockFooStatement
));
new NonStrictExpectations(){{
mockFooStatement.getFoos();
result = new ArrayList<Foo>(Arrays.asList(mockFoo));
}};
List<Foo> fooList = Deencapsulation.invoke(handler, "getFooList", fooStatementList);
Assert.assertTrue(fooList.size() == 2);
}
MockUp 断言错误 (0 != 2)
@Test
public void getFooListWithMockUpTest(
@Mocked final FooStatement mockFooStatement,
@Mocked final Foo mockFoo
){
new MockUp<FooStatement>(){
@Mock
public List<Foo> getFoos(){
return new ArrayList<Foo>(Arrays.asList(mockFoo));
}
};
List<FooStatement> fooStatementList = new ArrayList<>(Arrays.asList(
mockFooStatement,
mockFooStatement
));
List<Foo> fooList = Deencapsulation.invoke(handler, "getFooList", fooStatementList);
Assert.assertTrue(fooList.size() == 2);
}
您使用的 MockUp<?>
不正确。 MockUp<T?
将告诉 JMockit 重新定义一个 classes 加载到 JVM,这样就不会真正 class 初始化 FooStatement
,它会用 class 中定义的替换它们。 =14=].
所以基本上 MockUp<FooStatement>
会自动替换 new FooStatement()
的调用。
试试这样的:
@Test
public void getFooListWithMockUpTest(@Mocked final Foo mockFoo){
new MockUp<FooStatement>(){
@Mock
public List<Foo> getFoos(){
return new ArrayList<Foo>(Arrays.asList(mockFoo));
}
};
List<FooStatement> fooStatementList = new ArrayList<>(Arrays.asList(
new FooStatement(),
new FooStatement()
));
List<Foo> fooList = Deencapsulation.invoke(handler, "getFooList", fooStatementList);
Assert.assertTrue(fooList.size() == 2);
}
MockUp 已弃用,请使用 Expectations