2014-06-06 44 views
1

我正在尝试为Spring 3.2 MVC应用程序的服务层配置JUnit并编写测试用例。我无法找到关于如何从头开始配置JUnit的更多信息,并使其适用于Spring服务层。这里是我的问题春季服务层的JUnit测试用例

我真的不知道该用什么版本的JUnit的,所以我只是抓住了最新版本

Maven的JUnit的扶养

<dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.11</version> 
     <scope>test</scope> 
    </dependency> 

我的服务类

@Service 
public class AuthService implements IAuthService, ApplicationContextAware, 
     org.springframework.context.ApplicationListener<org.springframework.context.event.ContextRefreshedEvent> { 

public Collection<? extends String> addCommandPermissions(Session session, CommandMetadata command) { 

    Set<String> result = new HashSet<String>(); 
    String commandName = command.getBeanName(); 
    String defaultAdministerPermission = command.getAdministerPermission() 
    String defaultExecutePermission = command.getExecutePermission() 
    String overrideAdminPermission = null; 
    String overrideExecPermission = null; 
    String finalAdministerPermission = overrideAdminPermission == null ? defaultAdministerPermission 
      : overrideAdminPermission; 
    command.setAdministerPermission(finalAdministerPermission); 
    result.add(finalAdministerPermission); 
    String finalFxecutePermission = overrideExecPermission == null ? defaultExecutePermission 
      : overrideExecPermission; 
    command.setExecutePermission(finalFxecutePermission); 
    result.add(finalFxecutePermission); 
    try { 
     session.saveOrUpdate(command); 
     session.flush(); 
    } finally { 
     // TODO - more swallowed exceptions. 
    } 
    return result; 
} 

// some other methods 
} 

我的测试分类(部分使用常规)

import junit.framework.TestCase; 
import org.mockito.Mockito; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.mock.web.MockHttpSession; 
import org.springframework.test.context.ContextConfiguration; 
import com.dc.core.security.service.impl.AuthService 
import com.dc.core.behavior.command.model.impl.CommandMetadata; 
import org.hibernate.SessionFactory 
import org.hibernate.classic.Session 

@ContextConfiguration(locations = "file:WebContent/WEB-INF/applicationContext.xml") 
public class AuthServiceTest extends TestCase { 

    @Autowired 
    private AuthService authService; 

    @Autowired 
    private MockHttpSession mockHttpSession; 

    @Autowired 
    ApplicationContext appContext 

    @Autowired 
    SessionFactory sessionFactory 

    private Session mockHibernateSession = Mockito.mock(org.hibernate.classic.Session.class); 

    private CommandMetadata commandMetadata = new CommandMetadata(); 

    public void setUp() { 
     appContext.getBeanFactory().registerScope("request", new RequestScope()) 
     MockHttpServletRequest request = new MockHttpServletRequest() 

     ServletRequestAttributes attributes = new ServletRequestAttributes(request) 
     RequestContextHolder.setRequestAttributes(attributes) 
     CurrentRequestProperties currentRequestProperties = appContext.getBean("currentRequestProperties") 
     session = sessionHandler.initiateSession(sessionFactory, currentRequestProperties) 


    } 

    public void testAddCommandPermissions() { 
     commandMetadata.beanName = "TestBean" 
     commandMetadata.administerPermission = "TestBean.administer" 
     commandMetadata.executePermission = "TestBean.execute" 
     Collection<String> results = authorizationService.addCommandPermissions(session, commandMetadata); 
     assertTrue(results.contains("TestBean.administer")) 
    } 

    public void testCanary() { 
     assertTrue(true); 
    } 
} 

当我运行我的测试情况下,我得到下面的错误 显示java.lang.NullPointerException:不能为null对象上调用方法方法getBeanFactory()

我认为这个问题的原因是appContext没有注入正确,因此我得到NPE 。但我无法解决这个问题。我非常感谢某人的帮助。

+0

这只是一种猜测,但你不需要像'@RunWith(SpringJUnit4ClassRunner.class)来'对被测试类? – Opal

回答

3

添加Spring JUnit类跑步者。您还应该使用@Test注释,而不是扩展TestCase。

例如

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath:applicationContext.xml"}) 
0

这是我如何创建我的ServiceTest希望这将帮助你

只想补充一些想法和IM不知道这是否是最好的做法还是不那么纠正我,如果那里有什么不对。

  • MYPROJECT
    - SRC
    --hibernate.cfg.xml
    - 测试
    --TestPackage
    --- BaseServiceTest.class
    --- BlogspotServiceTest。
    - web
    --Web-INF
    --- BlogSpot的-的servlet-的test.xml
    ---jdbc-test.properties

在我的情况,我用我的blogspot-的servlet-的test.xml调用或创建所需的数据源和其他配置。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jee="http://www.springframework.org/schema/jee" 
    xmlns:lang="http://www.springframework.org/schema/lang" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd 
     http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> 

    <!-- .... some bean configuration --> 

    <bean id="propertyConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
      p:location="file:web/WEB-INF/jdbc-test.properties"/> 


    <bean id="dataSource" 
      class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" 
      p:driverClassName="${jdbc.driverClassName}" 
      p:url="${jdbc.databaseurl}" 
      p:username="${jdbc.username}" 
      p:password="${jdbc.password}"/> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="configLocation" value="classpath:hibernate.cfg.xml"/> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">${jdbc.dialect}</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
      </props> 
     </property> 
    </bean> 

    <!-- DAO'S --> 
    <bean id="blogspotDAO" class="package.BlogspotDAOImpl"/> 

    <!-- SERVICES --> 
    <bean id="blogspotService" class="package.BlogspotServiceImpl"/> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 


    <tx:annotation-driven transaction-manager="transactionManager"/> 
</beans> 

MY jdbc-test.properties文件

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.dialect=org.hibernate.dialect.MySQL5Dialect 
jdbc.databaseurl=jdbc:mysql://localhost:port/dbschemaname 
jdbc.username=root 
jdbc.password= 

对于hibernate.cfg。XML

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD//EN" 
    "http://www.hibernate.org/dtd//hibernate-configuration-3.0.dtd"> 

    <hibernate-configuration> 
     <session-factory> 
      <mapping class="somePackage.entity.Author"/> 
      <!-- Other Entity Class to be mapped --> 

     </session-factory> 
    </hibernate-configuration> 

和我创建的BaseClass为我减轻多个@SpringApplicationContext注释的创建,它也被用来创建在测试其他测试类所需的常用配置,你只需要扩展它。

@SpringApplicationContext({"file:web/WEB-INF/blogspot-servlet-test.xml"}) 
public class BaseServiceTest extends UnitilsJUnit4 { 
} 

我用@SpringApplicationContext从我的Spring配置加载在我的BaseClass的数据源和其他bean的配置,这是我如何实现它。

下图:看到Spring-Unitils Tutorial 更多细节

public class BlogspotServiceTest extends BaseServiceTest{ 

    @Mock //mock this object 
    @InjectInto(property = "blogspotDAO") //inject the dao to the test object 
    @SpringBean("blogspotDAO") //it is most likely @Autowired annotation 
    private BlogspotDAO blogspotDAOMock; 

    @TestedObject //annotate that this object is for test 
    @SpringBean("blogspotService") 
    private BlogspotService blogspotServiceMock; 

    @Test 
    public void testAddBlogSpot() { 
     assertNotNull("BlogspotService Not null",blogspotServiceMock); //test if blogspotServiceMock is not null 
    } 
} 

注:请创建内部TestPackage unitils.properties和unitils-local.properties到能够运行该程序。

对于@SpringBean说明,并标注请阅读:

Unitils-EasyMock

+1

你的文章不回答原来的问题。另外:Unitils的开发几乎被放弃了,恕我直言,恕不另行通知。 –