GVKun编程网logo

在JUnit测试中处理System.exit(0)(junit报错怎么看)

11

在本文中,我们将为您详细介绍在JUnit测试中处理System.exit的相关知识,并且为您解答关于0的疑问,此外,我们还会提供一些关于java–在JUnit测试中模拟对象–最佳实践?、java–在J

在本文中,我们将为您详细介绍在JUnit测试中处理System.exit的相关知识,并且为您解答关于0的疑问,此外,我们还会提供一些关于java – 在JUnit测试中模拟对象 – 最佳实践?、java – 在JUnit测试中自动装配Spring服务、java – 在JUnit测试中重复代码、java – 如何在JUnit测试中初始化数据的有用信息。

本文目录一览:

在JUnit测试中处理System.exit(0)(junit报错怎么看)

在JUnit测试中处理System.exit(0)(junit报错怎么看)

我正在为现有的Java
Swing应用程序执行一些测试,以便可以安全地重构和扩展代码而不会破坏任何内容。我从JUnit中的一些单元测试开始,因为这似乎是最简单的入门方法,但是现在我的首要任务是创建一些端到端测试,以对整个应用程序进行练习。

我将每种测试方法放在一个单独的测试用例中,并fork="yes"在Ant的junit任务中使用该选项,从而在每个测试中重新启动应用程序。但是,我想作为测试实现的一些用例涉及用户退出应用程序,这导致调用System.exit(0)的方法之一。JUnit将此视为错误:junit.framework.AssertionFailedError:Forked Java VM exited abnormally

有没有办法告诉JUnit以零返回码退出实际上是可以的?

答案1

小编典典

我该如何处理是安装一个安全管理器,该安全管理器在调用System.exit时会引发异常。然后是捕获异常且不会使测试失败的代码。

public class NoExitSecurityManager    extends java.rmi.RMISecurityManager{    private final SecurityManager parent;    public NoExitSecurityManager(final SecurityManager manager)    {        parent = manager;    }    public void checkExit(int status)    {        throw new AttemptToExitException(status);    }    public void checkPermission(Permission perm)    {    }}

然后在代码中,如下所示:

catch(final Throwable ex){    final Throwable cause;    if(ex.getCause() == null)    {        cause = ex;    }    else    {        cause = ex.getCause();    }    if(cause instanceof AttemptToExitException)    {        status = ((AttemptToExitException)cause).getStatus();    }    else    {        throw cause;    }}assertEquals("System.exit must be called with the value of " + expectedStatus, expectedStatus, status);

java – 在JUnit测试中模拟对象 – 最佳实践?

java – 在JUnit测试中模拟对象 – 最佳实践?

你认为JUnit测试中的嘲笑对象是最好的做法吗?我看不到很大的优势.当然,如果你有一个数据库不应该在你的测试中被考虑是有意义的,但是为什么不注入该组件的其他实现(如果使用 spring).一个对象工厂的测试将使这很容易.我没有太多经验(我们正在使用Mockito),但是我已经看到,该应用程序代码被修改,以使一些属性变得可耻!测试用例不应该在我的反对中消除生产代码的这种变化.

那你觉得这个话题怎么样?在这种情况下,您是在嘲笑您的对象还是为什么不这样做?

解决方法

嘲笑的想法是,你完全隔离你正在测试的东西.然后,当测试失败时,您可以确定问题所在,而无需遍历整个类依赖关系树.如果您一起测试多个类的行为,那么这不是真正的单元测试.

用于测试的对象工厂可能假定使用stubbed方法制作对象,而mocking框架本质上是用于测试的通用对象工厂.但是,嘲讽提供了比存根更多的东西 – Martin Fowler在这里详细介绍的一个区别:http://martinfowler.com/articles/mocksArentStubs.html.

如果你觉得嘲讽很难,而且你也发现你在做很多事情,那么这是TDD的典型例子,告诉你你的设计可以改进.

java – 在JUnit测试中自动装配Spring服务

java – 在JUnit测试中自动装配Spring服务

我有以下Spring服务:

@Service
public class MyService  {
   public List

和配置类:

@Configuration
public static class MyApplicationContext {

    @Bean
    public Filter filter(ApplicationContext context) {
        return new Filter();
    }
}

现在,我想创建一个单元测试来检查getIds方法是否返回正确的结果.我创建了以下JUnit测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=MyApplicationContext.class,loader=AnnotationConfigContextLoader.class)
public class AppTest
{
    @Autowired
    Filter filter;

    @Autowired
    MyService service;
}

编译器为Filter类找到正确的bean,但是为服务变量抛出“BeanCreationException:Could not autowire field”异常.我尝试将服务类添加到ContextConfiguration.classes,但随后编译器抛出“IllegalStateException:无法加载ApplicationContext”异常.

如何在ContextConfiguration中包含MyService?

最佳答案
将以下注释添加到MyApplicationContext以获取要扫描的服务@ComponentScan(“myservice.package.name”)

java – 在JUnit测试中重复代码

java – 在JUnit测试中重复代码

在测试类中复制代码是“坏”吗?如你所见,我将驾驶记录添加到驾驶记录中,以便在多种方法中进行测试.将它提取到私有帮助器方法是否更好?或者更清楚地保持它是否像它一样?在这种情况下你做什么?

@Test
public void shouldRemoveAllDrivingRecords() {
    Duration duration1 = new Duration(1,30,45);
    Duration duration2 = new Duration(2,50,12);

    DrivingRecord drivingRecord1 = new DrivingRecord(230.0,duration1,"This was a long trip");
    DrivingRecord drivingRecord2 = new DrivingRecord(300.0,duration2,"This trip is even longer.");

    drivingLog.addDrivingRecord(drivingRecord1);
    drivingLog.addDrivingRecord(drivingRecord2);

    drivingLog.removeAllDrivingLogs();

    assertEquals(0,drivingLog.numberOfdrivingRecords());
}

@Test
public void shouldSumThedistanceDriven() {
    Duration duration1 = new Duration(1,"This trip is even longer.");

    drivingLog.addDrivingRecord(drivingRecord1);
    drivingLog.addDrivingRecord(drivingRecord2);

    double expecteddistanceDriven = drivingRecord1.getdistance() + drivingRecord2.getdistance();
    double totaldistanceDriven = drivingLog.getdistanceDriven();

    assertEquals(expecteddistanceDriven,totaldistanceDriven,0.1);
}

解决方法

在任何地方复制代码都是“坏事”.此代码是否因某种原因而重复,或仅仅是为了方便.如果有一个原因,你想要在两者中使用相同的数据并以相同的方式添加它,那么一个小的“设置”方法是有意义的.

java – 如何在JUnit测试中初始化数据

java – 如何在JUnit测试中初始化数据

我的任务是为服务层编写压力(负载)测试.主要是CRUD操作.我们使用JUnit作为测试框架,使用JUnitPerf构建负载测试,使用 Spring注入服务bean,使用hibernate访问数据库.

压力测试类似于:读取实体 – 更新实体 – 保存 – 再次读取和比较.但是为了构建测试,我需要在数据库中使用一些测试数据,因此我需要在测试之前创建这些数据并在之后删除它.所需的流程:创建测试数据 – 在多个线程中运行测试 – 在所有线程完成执行后删除测试数据.有很多测试数据,所以使用一些测试转储sql文件来获取它会好得多.所以我需要的是:将数据从文件加载到数据库 – 执行压力测试 – 删除所有加载的数据.

我使用SchemaExport加载数据.我面临以下例外:

org.hibernate.HibernateException: No local DataSource found for configuration - 'dataSource' property must be set on LocalSessionfactorybean
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.configure(LocalDataSourceConnectionProvider.java:49)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:124)
at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56)
at org.hibernate.tool.hbm2ddl.ManagedProviderConnectionHelper.prepare(ManagedProviderConnectionHelper.java:27)
at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:180)
at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:133)
    .................

这是我的SessionFactory bean的定义:

<bean id="sessionFactory"https://www.jb51.cc/tag/factorybean/" target="_blank">factorybean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=${hibernate.dialect}
            hibernate.show.sql=${hibernate.show.sql}
        </value>
    </property>
    <property name="annotatedClasses">
        <list>
            ...
            my classes
            ...
        </list>
    </property>
</bean>

我按以下方式启动测试:

@BeforeClass
public static void createTestData() throws AccessDeniedException,AccountException,sqlException {
    ClasspathXmlApplicationContext appCtx = new ClasspathXmlApplicationContext("classpath:/applicationContext_test.xml");
    AnnotationSessionfactorybean sessionfactorybean = (AnnotationSessionfactorybean) appCtx.getBean("sessionFactory");
    org.hibernate.cfg.Configuration configuration = sessionfactorybean.getConfiguration();
    SchemaExport schemaExport = new SchemaExport(configuration);
    schemaExport.drop(false,true);
    schemaExport.create(false,true);
    if (schemaExport.getExceptions().size() > 0) {
        for (Object exception : schemaExport.getExceptions()) {
            if (exception instanceof Throwable) {
                ((Throwable) exception).printstacktrace();
            }
        }
        throw new IllegalStateException();
    }
}

我提到我需要进行负载测试以明确我不能在测试块中包含数据初始化.

我有两个问题:
1)如何在加载测试之前初始化数据并在之后将其删除?
2)我是正确的吗?或者也许我应该转用另一种技术进行压力测试?

解决方法

您可以使用 DBUnit为您执行数据加载.或者使用 Unitils将DBUnit与Spring和Hibernate集成在一起.

问候,

我们今天的关于在JUnit测试中处理System.exit0的分享已经告一段落,感谢您的关注,如果您想了解更多关于java – 在JUnit测试中模拟对象 – 最佳实践?、java – 在JUnit测试中自动装配Spring服务、java – 在JUnit测试中重复代码、java – 如何在JUnit测试中初始化数据的相关信息,请在本站查询。

本文标签: