在JUnit中使用@Rule测试文件和目录

伴随JUnit中 TemporaryFolder @Rule 的面世,测量检验文件和目录变得容易了。

倘使你的单元测量检验没有信任或许独有Android上的总结依靠,你应有在地点开采机器上运转测验。
这种测量试验方法是火速的,因为它能够扶助你防止每一回运转测验时将对象应用程序和单元测验代码加载到大要设备或模拟器上的支付。
因而,运转单元测试的实践时间大大收缩。
使用这种艺术,通常接收模拟框架(如Mockito)来促成别的依靠关系。

在 JUnit
中,准则(@Rule)可看做协会测量检验器具(fixture)时开始化方法和清理办法的代表和补偿(在
JUnit
中,那2种格局分别通过以下注解标记:org.junit.Beforeorg.junit.Afterorg.junit.BeforeClass
org.junit.AfterClass
。並且法规的机能更是有力况且也更易于在类型和类之间分享。

澳门新浦京娱乐游戏,布局测量检验情状

在你的Android
Studio项目中,必得将用来位置单元测验的源文件存款和储蓄在module-name / src /
test / java /。 创立新类型时,此目录已存在。

您还亟需为品种陈设测量检验正视关系,以使用JUnit 4框架提供的标准API。
假如您的测验须求与Android重视关系相互,请满含Mockito库以简化本地单元测量检验。
要打听有关在地头单元测量检验中利用模拟指标的更加多消息,请参阅上边包车型大巴Mocking
Android dependencies。

在应用程序的顶尖build.gradle文件中,您要求将那个库钦定为依赖关系:

dependencies {
    // Required -- JUnit 4 framework
    testCompile 'junit:junit:4.12'
    // Optional -- Mockito framework
    testCompile 'org.mockito:mockito-core:1.10.19'
}

翻译注:测量试验器械是指作为测验运维基准的一组对象所展现的三个安静意况。其目标是保障测验是运转在二个鲜明的、牢固的条件中的,以落到实处地衡量试的可重新推行。打算输入数据、生成模拟指标(Mock)、将一定的数额加载到数据库、复制一组特定的文件等,那些都归属结构测验器具。

开创二个位置单元测量试验类

你的当地单元测量试验类应该写成三个JUnit 4测验类。
JUnit是Java最受迎接和比比皆已经运用的单元测量检验框架。 那么些框架的风靡版本,JUnit
4,允许你以比它的先行者版本更清洁和更加灵敏的艺术编写测量试验。
与原先的基于JUnit 3的Android单元测验的不二秘技不相同,使用JUnit
4,您无需扩充junit.framework.TestCase类。
您也不须要在测量检验方法名称前拉长’test’关键字,可能利用junit.framework或junit.extensions包中的任何类。

要成立基本的JUnit 4测量试验类,请创制二个含有几个或七个测验方法的Java类。
测量检验方法以@Test注释初叶,包括练习和认证要测量检验的构件中的单个功用的代码。

以下示例彰显怎么完成地点单元测量试验类。
测验方法emailValidator_CorrectEmailSimple_ReturnsTrue验证被测应用程序中的isValidEmail()方法是不是再次回到正确的结果。

以下示例突显怎么得以达成本地单元测验类。
测量试验方法emailValidator_CorrectEmailSimple_ReturnsTrue验证被测应用程序中的isValidEmail()方法是还是不是再次来到正确的结果。

import org.junit.Test;
import java.util.regex.Pattern;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

public class EmailValidatorTest {

    @Test
    public void emailValidator_CorrectEmailSimple_ReturnsTrue() {
        assertThat(EmailValidator.isValidEmail("name@email.com"), is(true));
    }
    ...
}

要测验应用程序中的组件是或不是重返预期结果,请使用junit.Assert情势施行验证检查(或断言),以便将受测量检验组件的景色与一些预期值进行比较。
为了使测量检验更可读,能够使用Hamcrest
matchers(举例is()和equalTo()方法)将回到的结果与预期结果进行匹配。

待测量检验的代码

public void writeTo(String path, String content) throws IOException {
    Path target = Paths.get(path);
    if (Files.exists(target)) {
        throw new IOException("file already exists");
    }
    Files.copy(new ByteArrayInputStream(content.getBytes("UTF8")), target);
}

Mock Android dependencies

默许意况下,Gradle的Android插件针对android.jar库的修正版本实践业地单元测量检验,该版本不带有别的实际代码。
相反,从单元测量检验中调用Android类的方法会抛出极度。
那是为着保险您只测验你的代码,不依附于于Android平台的其余特定的行为(当未有明了模拟时)。

你能够应用模拟框架在代码中存根外界信任关系,以便轻便测量试验你的组件是不是遵从预期的章程与依赖关系相互作用。
通过用模拟指标替换Android正视项,您能够将单元测量检验与Android系统的别的部分隔断,同时表明那么些信任关系中的准确方法是或不是被调用。
Java的Mockito
mocking框架(1.9.5及更加高版本)提供了与Android单元测量试验的包容性。
使用Mockito,您能够布署模拟指标以在调用时回来一些特定值。

要动用此框架将mock对象增加到本地单元测量检验,请遵照以下编制程序模型:
1>
在build.gradle文件中蕴藏Mockito库信任关系,如布署测量试验境况中所述。
2>
在单元测量试验类定义的起来,增添@RunWith(MockitoJUnitRunner.class)注释。
这一个注释告诉Mockito测量检验运转器验证你的框架的利用是理之当然的,并简化了您的依葫芦画瓢指标的开首化。
3> 要为Android注重项创制模拟指标,请在字段注解早先增多@Mock注释。
4>
要银行卡信赖关系的行事,能够运用when()和thenReturn()方法钦赐条件并重临值。

以下示例突显怎么创制使用mock Context对象的单元测验。

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.CoreMatchers.*;
import static org.mockito.Mockito.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import android.content.SharedPreferences;

@RunWith(MockitoJUnitRunner.class)
public class UnitTestSample {

    private static final String FAKE_STRING = "HELLO WORLD";

    @Mock
    Context mMockContext;

    @Test
    public void readStringFromContext_LocalizedString() {
        // Given a mocked Context injected into the object under test...
        when(mMockContext.getString(R.string.hello_word))
                .thenReturn(FAKE_STRING);
        ClassUnderTest myObjectUnderTest = new ClassUnderTest(mMockContext);

        // ...when the string is returned from the object under test...
        String result = myObjectUnderTest.getHelloWorldString();

        // ...then the result should be the expected one.
        assertThat(result, is(FAKE_STRING));
    }
}

要打听有关使用Mockito框架的越多新闻,请参阅Mockito API
reference和演示代码中的SharedPreferencesHelperTest类。

如若Android.jar中的Android
API抛出的相当对于测验有标题,您能够改进行为,以使方法通过在档期的顺序的顶尖build.gradle文件中增加以下配置来回到null或零:

android {
  ...
  testOptions {
    unitTests.returnDefaultValues = true
  }
}

警戒:将returnDefaultValues属性设置为true应该小心。
null/零重返值能够在测量检验中引进回归,那难以调节和测验,并且也许同意失败的测验通过。
只可以采纳它当做最终的手法。

测试类

public class FileWriterTest {

    private FileWriter fileWriter = new FileWriter();

    @Rule
    public TemporaryFolder temporaryFolder = new TemporaryFolder();

    @Rule
    public ExpectedException thrown = ExpectedException.none();

    @Test
    public void throwsErrorWhenTargetFileExists() throws IOException {
        // arrange
        File output = temporaryFolder.newFile("output.txt");

        thrown.expect(IOException.class);
        thrown.expectMessage("file already exists");

        // act
        fileWriter.writeTo(output.getPath(), "test");
    }

    @Test
    public void writesContentToFile() throws IOException {
        // arrange
        File output = temporaryFolder.newFolder("reports")
                .toPath()
                .resolve("output.txt")
                .toFile();

        // act
        fileWriter.writeTo(output.getPath(), "test");

        // assert
        assertThat(output)
                .hasContent("test")
                .hasExtension("txt")
                .hasParent(resolvePath("reports"));
    }

    private String resolvePath(String folder) {
        return temporaryFolder
                .getRoot().toPath()
                .resolve(folder)
                .toString();
    }
}

翻译注:第35行的 assertThat(卡塔尔 是类
org.assertj.core.api.Assertions 中的静态方法。

TemporaryFolder 提供了2个方法 newFile
newFolder,分别用于管理文件和目录。那2个主意都足以回来所急需的靶子。重临的文本或目录都以由
setup
方法创立的并被寄存在有的时候目录中。要想获取有时目录本身的门路,能够选用
TemporaryFoldergetRoot 方法。

任由测量试验成功与否,任何在测量检验进程中增添到有的时候目录的文件或目录都会在测验停止时去除。

本示例能够从本人在 GitHub 上的品类
unit-testing-demo
中找到,除了这么些之外该品种中还应该有为数不菲任何示例可供各位参谋。

运作本地单元测量检验

要运转业地单元测验,请根据下列步骤操作:
1> 通过单击工具栏中的Sync Project,确认保障您的项目与Gradle同步。
2> 使用以下方式之一运营测验:
a> 要运维单个测验,请展开“
Project”窗口,然后右键单击测量试验,然后单击Run。
b>
要测量试验类中的全数办法,请右键单击测验文件中的类或方法,然后单击Run。
c> 要在目录中运营具备测量检验,请右键单击目录并精选Run tests。
Gradle的Android插件编译坐落于默许目录(src / test / java
/)中的本地单元测量检验代码,创设贰个测量检验app,并动用暗中认可的测量检验运维器类在该地施行它。
然后,Android Studio将要“ Run”窗口中体现结果。

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图