有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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"
 }
}

共 (3) 个答案

  1. # 2 楼答案

    您应该做的唯一一件事是将@WebAppConfiguration放在测试类之前:

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = {Application.class})
    @WebAppConfiguration
    public class MyTestClass{
    ......
    }
    

    在类内部,您应该使用@autowired注入您的会话类,就像您所做的那样。 在测试之后,在调用服务函数之前,可以使用setter设置会话细节。细节将在您的服务中可见,因此一切都应该正常工作。 测试类中@WebAppConfiguration的存在会指示TestContext框架(TCF)为测试加载WebApplicationContext(WAC),以便为您提供会话范围的bean

  2. # 3 楼答案

    IMHO试图在单元测试中自动连接会话范围的bean,这是一个糟糕的设计。正常的单元测试应该可以通过模拟bean来实现。使用类似mockito的模拟框架,您甚至可以控制使用预期参数调用的方法

    如果您需要与该bean进行实际的交互——但它现在是一个集成测试——那么您应该按照您正在测试的用例中的样子手动构建bean,并手动将其注入到您正在测试的服务类中

    总之,依赖于会话范围的bean(它不是视图层的控制器吗?)服务bean(应该是服务层)内部有异味。这可能是一个完全正确的设计,但你真的应该三思而后行,主要是如果现在很难测试的话

    别忘了:测试应该尽可能简单。如果他们不能,再看看你的总体设计