Java spring/jsf控制器的JUnit测试-数据重置
我遇到了以下问题。我有一个带有模型的控制器,其中包含一些字段、列表等。现在我有了一个Java spring/jsf控制器的JUnit测试-数据重置,java,spring,jsf,junit,primefaces,Java,Spring,Jsf,Junit,Primefaces,我遇到了以下问题。我有一个带有模型的控制器,其中包含一些字段、列表等。现在我有了一个@Before方法,在这里我初始化了一些测试数据。不幸的是,每次调用,例如model.getList().add(element)这个列表都有新的引用,并且会再次创建,我的数据丢失。我可以调试到add方法中,并检查它是否正确地添加了它,然后当调用nextadd时,列表具有新的引用并且为空。由于这个问题,当涉及到@Test方法时,它们应该调用一些控制器方法并对以前添加的数据执行操作,但没有。我的控制器和模型的作用域
@Before
方法,在这里我初始化了一些测试数据。不幸的是,每次调用,例如model.getList().add(element)
这个列表都有新的引用,并且会再次创建,我的数据丢失。我可以调试到add
方法中,并检查它是否正确地添加了它,然后当调用nextadd
时,列表具有新的引用并且为空。由于这个问题,当涉及到@Test
方法时,它们应该调用一些控制器方法并对以前添加的数据执行操作,但没有。我的控制器和模型的作用域是@Scope(value=“view”,proxyMode=ScopedProxyMode.TARGET\u CLASS)
。当我将其更改为@SessionScope
时,它工作正常,但由于应用程序的要求,我不得不将范围切换到视图。你能帮我解决这个问题吗?也许是其他的测试方法或者其他的想法
这是我的控制器类:
@Controller
@Scope(value = "view", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class BaseController extends AbstractController<BaseModel> {
//some logic
}
模型类:
@Repository
@Scope(value = "view", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class BaseModel extends AbstractModel {
@PostConstruct
public void init() {
//initialization stuff
}
//data logic methods
}
最后是我的测试课:
@RunWith(SpringRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = Application.class)
@AutoConfigureTestDatabase
public class BaseControllerTest {
@Autowired
private WebApplicationContext context;
@Autowired
private BaseController controller;
@Autowired
private BaseModel model;
@Autowired
private LoggingDao loggingDao;
private MockMvc mvc;
private UsbDeviceDBO usbDeviceDBO1;
private UsbDeviceDBO usbDeviceDBO2;
private UsbDeviceDBO usbDeviceDBO3;
private UsbDeviceDBO usbDeviceDBO4;
private UsbDeviceDBO usbDeviceDBO5;
private UsbDeviceDBO usbDeviceDBO6;
@Before
public void before() {
mvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build();
FacesContext context = ContextMocker.mockFacesContext();
UIViewRoot uiViewRoot = Mockito.mock(UIViewRoot.class);
Mockito.when(context.getCurrentInstance().getViewRoot())
.thenReturn(uiViewRoot);
Mockito.when(
context.getCurrentInstance().getViewRoot().getLocale())
.thenReturn(new Locale("en"));
}
public void insertTestData() {
usbDeviceDBO1 = new UsbDeviceDBO("device1", EDeviceUsageMode.ALWAYS, "Custom", "comment1");
usbDeviceDBO2 = new UsbDeviceDBO("device2", EDeviceUsageMode.INSTALL, "Custom", "comment2");
usbDeviceDBO3 = new UsbDeviceDBO("device3", EDeviceUsageMode.ALWAYS, "Custom", "comment3");
usbDeviceDBO4 = new UsbDeviceDBO("USB\\class_01", EDeviceUsageMode.ALWAYS, "Class 01: Audio", "comment4");
usbDeviceDBO5 = new UsbDeviceDBO("USB\\VID_05BA&PID_000A", EDeviceUsageMode.ALWAYS, "[Diebold] (Digital Persona, Inc) Biometric Reader", "comment5");
usbDeviceDBO6 = new UsbDeviceDBO("USB\\VID_0596&PID_0001", EDeviceUsageMode.ALWAYS, "[Wincor Nixdorf] 3M Touch Controller", "comment5");
model.getUsbDeviceTable().add(usbDeviceDBO1);
model.getUsbDeviceTable().add(usbDeviceDBO2);
model.getUsbDeviceTable().add(usbDeviceDBO3);
model.getUsbDeviceTable().add(usbDeviceDBO4);
model.getUsbDeviceTable().add(usbDeviceDBO5);
model.getUsbDeviceTable().add(usbDeviceDBO6);
model.getUsbDeviceTable().clearSelection();
}
@Test
public void updateUsedDeviceIdsTest() {
insertTestData();
UsbDeviceDBO clonedDevice = new UsbDeviceDBO("device1", EDeviceUsageMode.ALWAYS, "Custom", "comment1");
controller.updateUsedDeviceIds(clonedDevice);
assertEquals(5, model.getUsedDeviceIds().size());
}
每次涉及到updateUsedDeviceTest
方法时,断言都会失败,但应该有5个元素,但当添加测试数据时,在每次调用model.getUsbDeviceTable().add(usbDeviceDBO1)之后代码>我获得了对包含数据的列表的新引用。因此,当我的controller.updateUserDeviceID(clonedDevice)时代码>开始,列表有0个元素。在我的模型中,同样的情况也发生在常规对象上,而不是集合上。任何帮助都将不胜感激
我使用的是SpringBoot 2.0.2+PrimeFaces 6.2,运行在IntelliJ IDE、JSF 3.2.1版、JUnit 4.12上。clearSelection()
方法在做什么?table.getSelectedList().clear()
-它只是清除当前选择的表,即数据添加到的不同列表。没有范围,例如spring上的视图。你是在使用一个听者还是类似的东西?
@RunWith(SpringRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = Application.class)
@AutoConfigureTestDatabase
public class BaseControllerTest {
@Autowired
private WebApplicationContext context;
@Autowired
private BaseController controller;
@Autowired
private BaseModel model;
@Autowired
private LoggingDao loggingDao;
private MockMvc mvc;
private UsbDeviceDBO usbDeviceDBO1;
private UsbDeviceDBO usbDeviceDBO2;
private UsbDeviceDBO usbDeviceDBO3;
private UsbDeviceDBO usbDeviceDBO4;
private UsbDeviceDBO usbDeviceDBO5;
private UsbDeviceDBO usbDeviceDBO6;
@Before
public void before() {
mvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build();
FacesContext context = ContextMocker.mockFacesContext();
UIViewRoot uiViewRoot = Mockito.mock(UIViewRoot.class);
Mockito.when(context.getCurrentInstance().getViewRoot())
.thenReturn(uiViewRoot);
Mockito.when(
context.getCurrentInstance().getViewRoot().getLocale())
.thenReturn(new Locale("en"));
}
public void insertTestData() {
usbDeviceDBO1 = new UsbDeviceDBO("device1", EDeviceUsageMode.ALWAYS, "Custom", "comment1");
usbDeviceDBO2 = new UsbDeviceDBO("device2", EDeviceUsageMode.INSTALL, "Custom", "comment2");
usbDeviceDBO3 = new UsbDeviceDBO("device3", EDeviceUsageMode.ALWAYS, "Custom", "comment3");
usbDeviceDBO4 = new UsbDeviceDBO("USB\\class_01", EDeviceUsageMode.ALWAYS, "Class 01: Audio", "comment4");
usbDeviceDBO5 = new UsbDeviceDBO("USB\\VID_05BA&PID_000A", EDeviceUsageMode.ALWAYS, "[Diebold] (Digital Persona, Inc) Biometric Reader", "comment5");
usbDeviceDBO6 = new UsbDeviceDBO("USB\\VID_0596&PID_0001", EDeviceUsageMode.ALWAYS, "[Wincor Nixdorf] 3M Touch Controller", "comment5");
model.getUsbDeviceTable().add(usbDeviceDBO1);
model.getUsbDeviceTable().add(usbDeviceDBO2);
model.getUsbDeviceTable().add(usbDeviceDBO3);
model.getUsbDeviceTable().add(usbDeviceDBO4);
model.getUsbDeviceTable().add(usbDeviceDBO5);
model.getUsbDeviceTable().add(usbDeviceDBO6);
model.getUsbDeviceTable().clearSelection();
}
@Test
public void updateUsedDeviceIdsTest() {
insertTestData();
UsbDeviceDBO clonedDevice = new UsbDeviceDBO("device1", EDeviceUsageMode.ALWAYS, "Custom", "comment1");
controller.updateUsedDeviceIds(clonedDevice);
assertEquals(5, model.getUsedDeviceIds().size());
}