用于验证变量已更改的单元测试
Unit test to verify that variable has been changed
我正在为将 JPA 用于数据库持久层的 EJB 应用程序创建一系列单元测试。由于这些是单元测试,我将 EJB bean 视为 POJO,并使用 Mockito 模拟 EntityManager 调用。
我遇到的问题是,我的 class 测试中的方法之一在调用 EntityManager merge(...)
方法保存实体之前更改了实体中的值,但我可以'看看单元测试如何能够检查被测试的方法是否确实改变了值。
虽然我可以添加另一个 when(...)
方法,以便 merge(...)
方法 returns 具有修改值的实体实例,但我认为这不会是任何受益,因为它实际上不会测试被测 class 是否修改了值并且会破坏测试的目的。
我测试的class中的方法如下:
public void discontinueWidget(String widgetId) {
Widget widget = em.find(Widget.class, widgetId);
//Code that checks whether the widget exists has been omitted for simplicity
widget.setDiscontinued(true);
em.merge(widget);
}
我单元测试中的代码如下:
@Mock
private EntityManager em;
@InjectMocks
private WidgetService classUnderTest;
@Test
public void discontinueWidget() {
Widget testWidget = new Widget();
testWidget.setWidgetName("foo");
when(em.find(Widget.class, "foo")).thenReturn(testWidget);
classUnderTest.discontinueWidget("en");
//something needed here to check whether testWidget was set to discontinued
//this checks the merge method was called but not whether the
//discontinued value has been set to true
verify(em).merge(testWidget );
}
由于小部件 class 没有被模拟,所以我不能按照 verify(testWidget).setDiscontinued(true);
的方式调用某些东西
我的问题是如何检查被测class中的discontinueWidget(...)
方法是否真的设置了Widget
[=36=中的discontinued
变量] 到 true
?
我使用的是 JUnit 4.12 版和 Mockito 1.10.19 版。
您也可以将测试中的 Widget 声明为 mock,并对其进行验证。
Widget testWidget = mock(Widget.class);
when(em.find(Widget.class, "foo")).thenReturn(testWidget);
classUnderTest.discontinueWidget("en");
//something needed here to check whether testWidget was set to discontinued
verify(testWidget).setDiscontinued(true);
//this checks the merge method was called but not whether the
//discontinued value has been set to true
verify(em).merge(testWidget );
我正在为将 JPA 用于数据库持久层的 EJB 应用程序创建一系列单元测试。由于这些是单元测试,我将 EJB bean 视为 POJO,并使用 Mockito 模拟 EntityManager 调用。
我遇到的问题是,我的 class 测试中的方法之一在调用 EntityManager merge(...)
方法保存实体之前更改了实体中的值,但我可以'看看单元测试如何能够检查被测试的方法是否确实改变了值。
虽然我可以添加另一个 when(...)
方法,以便 merge(...)
方法 returns 具有修改值的实体实例,但我认为这不会是任何受益,因为它实际上不会测试被测 class 是否修改了值并且会破坏测试的目的。
我测试的class中的方法如下:
public void discontinueWidget(String widgetId) {
Widget widget = em.find(Widget.class, widgetId);
//Code that checks whether the widget exists has been omitted for simplicity
widget.setDiscontinued(true);
em.merge(widget);
}
我单元测试中的代码如下:
@Mock
private EntityManager em;
@InjectMocks
private WidgetService classUnderTest;
@Test
public void discontinueWidget() {
Widget testWidget = new Widget();
testWidget.setWidgetName("foo");
when(em.find(Widget.class, "foo")).thenReturn(testWidget);
classUnderTest.discontinueWidget("en");
//something needed here to check whether testWidget was set to discontinued
//this checks the merge method was called but not whether the
//discontinued value has been set to true
verify(em).merge(testWidget );
}
由于小部件 class 没有被模拟,所以我不能按照 verify(testWidget).setDiscontinued(true);
我的问题是如何检查被测class中的discontinueWidget(...)
方法是否真的设置了Widget
[=36=中的discontinued
变量] 到 true
?
我使用的是 JUnit 4.12 版和 Mockito 1.10.19 版。
您也可以将测试中的 Widget 声明为 mock,并对其进行验证。
Widget testWidget = mock(Widget.class);
when(em.find(Widget.class, "foo")).thenReturn(testWidget);
classUnderTest.discontinueWidget("en");
//something needed here to check whether testWidget was set to discontinued
verify(testWidget).setDiscontinued(true);
//this checks the merge method was called but not whether the
//discontinued value has been set to true
verify(em).merge(testWidget );