当前位置: 首页 > 知识库问答 >
问题:

创建目录的单元测试代码

黄聪
2023-03-14

我有创建目录并向其中传输文件的代码。我想对它进行单元测试。但问题是,当我运行单元测试时,这些目录是创建的,但我不希望这样。我希望代码仅在运行生产环境时创建这些目录。我在google上搜索过这个,但所有的搜索结果都表明是JUnit类临时文件夹。但这不是我想要的。我没有在测试用例中创建目录。我只是在测试创建它们的代码。所以我不确定TemporaryFolder类如何帮助我实现这一点。假设我有如下代码

public class Util {

    public File getLocation(String location) {
        File result = new File(location);

        if (!result.exists()) {
            result.mkdirs(); 
        }
        return result;
    }
}

如何对这样的代码进行单元测试?每次我打电话

util.getLocation("base/location"); 

正在创建目录基/位置,但我不希望这样。只有在生产环境中运行代码时才能创建它们。

更新由于对问题的评论。我决定更新我的问题。首先,get位置签名有点误导。这不是我正在测试的确切代码,它有点长,所以我试图用它来传达这个想法。它的功能基本上相同,但问题是getLoction()不接受如上所示的参数。在getloc内调用了另一个方法,它将字符串返回到路径。这意味着我无法控制创建目录时使用的内容。并且我运行生产和开发环境,一旦这些目录在运行生产代码时创建,即使代码被重建,它们也不应该被删除,因为单元测试将在每个构建上运行。

public File getLocationForReports() {

    String softwareHome = GeneralUtil.getSoftwareHome();
    File path = new Path(softwareHome, "reports").toFile();

    if (!path.exists()) {
        path.mkdirs();    
    }
    return path;
}

正如您在上面看到的,我无法控制GeneralUtil.getSoftwareHome()返回的内容,因此我甚至无法发送像“tmp/位置”这样的虚拟位置并稍后删除,我也不想删除这些目录,如果它们是在生产代码运行时创建的,因为我会一些文件。

共有2个答案

井旺
2023-03-14

我建议使用PowerMock创建测试。有两种方法可以做到这一点。两者都需要PowerMock,测试需要如下注释:@RunWith(PowerMockRunner.class)@PrepareForTest(要测试的类。class)

首先,您可以尝试模拟对GeneralUtil的静态调用。使用powermockito获取SoftwareHome()。PowerMockito模拟单个静态方法和返回对象

第二个选项是模拟Path对象的构造函数及其返回的调用:mockito模拟带有参数的构造函数

这样可以测试代码的功能。

王经赋
2023-03-14

我建议尽可能不要使用PowerMock进行任何测试。

PowerMock操纵您的生产类;它通常会导致非常奇怪的错误(您可以搜索几个小时,却从未在代码中找到真正的问题);它扼杀了您进行覆盖的能力。

换句话说:对我来说,对PowerMock的“需求”很大程度上可以理解为:您的设计结构不允许进行合理的测试。而不是投资丑陋的大电锤。。。你最好花点时间重新设计你的设计!

在您的情况下:摆脱对静态方法的调用;确保您可以使用依赖注入来为您的代码提供模拟对象。含义:像EasyMock这样的框架允许您创建模拟对象,这些对象可以执行您希望它们执行的任何操作。您将此类“准备好的”模拟传递给您的测试代码;然后您可以完全控制测试期间将发生的事情。

你看,本质上你的问题是你的生产代码在一个地方做了太多的事情;因此你很难测试它。拆开它,将代码中发现的每个“责任”放入单独的类/方法中;并单独测试它们。

 类似资料:
  • 为了让单元测试跑一个批处理的任务,这个框架必须加载这个任务的ApplicationContext,两个注解的触发方式: @RunWith(SpringJUnit4ClassRunner.class):表明这个类需要使用Spring的测试工具 @ContextConfiguration(locations = {…}):表明哪些xml文件包含ApplicationContext @RunWith

  • 问题内容: 在为Java代码构建一套单元测试时,是否有关于将测试代码与源代码放置在何处的约定? 例如,如果我有一个包含一堆源文件的目录,那么最好将测试用例本身放在其中或使用类似的内容。 如果首选后者,那么在包之外无法使用类的 / 成员时,如何测试代码的内部? 问题答案: 您可以将测试与原始类放在同一包中,即使源代码位于其自己的目录根目录下: 您可以在下声明一个类,并在下声明其测试。 至于访问私有成

  • 问题内容: 有没有办法动态创建测试用例?我尝试了以下方法。 ..可以正确创建所有方法(它们显示在并且可以调用),但是unittest的测试检测器也不执行(“ Ran 0 tests in …”) 由于我可能会问错问题-我想实现的目标是: 我有一个文件,其中包含测试数据,输入文件名列表和预期数据(在上述代码中简化为),存储在Python字典中。例如,键是类别,值是测试用例的列表。 目前,我只是遍历所

  • 我是一个使用V13的情报人员。 我有一个简单的java项目(默认)结构,如下所示: 现在,我想编写一个简单的测试,并将代码放在/src/test/java目录中。所以我决定更改我的项目格式,使其看起来像: 创建该结构后,我显然希望将src中的当前类移到main/java/com...结构。 如果我在根目录中创建了一个新目录,我可以选择将目录标记为测试源根目录,但它仍然挂在根目录上,如下所示: 有人

  • 我有一些代码,它使用的是class的方法,它是异步的。另外,我正在使用微软的单元测试应用程序项目来测试应用程序。 问题是测试框架并没有等待异步代码的运行结束,所以我无法检查它的结果。 如何使用Unit Test App项目测试异步代码?我没有使用异步/等待修改器。

  • 问题内容: 我使用大猩猩Web套接字框架,并使用以下客户端在本地运行Web套接字并对其进行调试 https://github.com/gorilla/websocket 当我在chrome控制台中使用它时此方法有效,但是我的问题是是否有一种方法可以进行一些单元测试并避免使用chrome控制台? 问题答案: 使用net / http / httptest 软件包创建一个测试服务器。使用Gorilla