java如何在单元测试执行之前实例化seision,以便服务类中的自动连接会话能够正确地创建bean?
如何在单元测试执行之前实例化seision,以便服务类中的自动连线会话正确地创建bean
我的测试使用了服务类中的一些方法。此服务类方法使用自动连线会话。关键是,我不知道如何在测试中(或之前)创建/注入会话,以便会话bean使用我预先设置的细节在服务中正确创建
会话类如下所示:
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserSession {
Long idUser;
//...other
//geters and seters
}
测试等级:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {Application.class})
public class MyTestClass{
@Autowired
private UserSession session;
@Autowired
private MyServiceClass myServiceClass;
@Test
public void myTestMethod() {
....
//This is where i wanted to set some session detailes
//Something like this:
session.setUserRolls(...);
myServiceClass.myServiceMethod();
}
}
在我的服务课上,我有这样的东西:
@Service
public class MyServiceClass{
@Autowired
private UserSession session;
private void myServiceMethod(){
....
List <UserRol> rolls = session.getUserRolls();
//in this case i want to retrieve user rolls from session object
//
//now i get an error in my current implementation that looks like this
//Error: no Scope registered for scope name "session"
}
}
# 1 楼答案
您可以使用Spring MockMVC框架并添加@WebAppConfiguration,这将为您提供会话范围的bean
看看这个例子How to test a spring controller method by using MockMvc?
# 2 楼答案
您应该做的唯一一件事是将@WebAppConfiguration放在测试类之前:
在类内部,您应该使用@autowired注入您的会话类,就像您所做的那样。 在测试之后,在调用服务函数之前,可以使用setter设置会话细节。细节将在您的服务中可见,因此一切都应该正常工作。 测试类中@WebAppConfiguration的存在会指示TestContext框架(TCF)为测试加载WebApplicationContext(WAC),以便为您提供会话范围的bean
# 3 楼答案
IMHO试图在单元测试中自动连接会话范围的bean,这是一个糟糕的设计。正常的单元测试应该可以通过模拟bean来实现。使用类似mockito的模拟框架,您甚至可以控制使用预期参数调用的方法
如果您需要与该bean进行实际的交互——但它现在是一个集成测试——那么您应该按照您正在测试的用例中的样子手动构建bean,并手动将其注入到您正在测试的服务类中
总之,依赖于会话范围的bean(它不是视图层的控制器吗?)服务bean(应该是服务层)内部有异味。这可能是一个完全正确的设计,但你真的应该三思而后行,主要是如果现在很难测试的话
别忘了:测试应该尽可能简单。如果他们不能,再看看你的总体设计