【问题标题】:Best practice for testing object in android. Should I instantiate class in test?在 android 中测试对象的最佳实践。我应该在测试中实例化类吗?
【发布时间】:2015-09-16 13:35:28
【问题描述】:

我目前正在尝试在 android 中对应用程序进行单元测试。我将 Dagger 2 用于 DI。我目前有一个名为“ErrorChecker”的类,我用它来检查电子邮件是否具有有效格式以及密码是否具有特定长度等。

在我的 ErrorChecker 类中是我注入的上下文。如果输入的电子邮件格式不正确,这基本上仅用于获取带有警告的字符串资源。我希望能够在我的测试中将上下文注入到 ErrorChecker 类的版本中。我不确定这是否绝对必要?下面是我的测试课。

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class ErrCheckerTest {


private ErrorChecker errchecker;

@Before
public void setup()
{
     errchecker = new ErrorChecker();
     errchecker.setCont(MyApplication.getInst());
}



@Test
public void validEmailTest()
{
   //invalid emails

    errchecker.setEmail("notvalidemail");
    assertFalse(errchecker.emailValid());
    errchecker.setEmail("jimm.***@yahoo.com.com");
    assertFalse(errchecker.emailValid());
    errchecker.setEmail(".*%&$$$$$.@fish.ie");
    assertFalse(errchecker.emailValid());
    errchecker.setEmail("");
    assertFalse(errchecker.emailValid());
    errchecker.setEmail("jimm.@yaaaaaa");
    assertFalse(errchecker.emailValid());


    // valid emails

    errchecker.setEmail("eoin@yahoo.com");
    assertTrue(errchecker.emailValid());
    errchecker.setEmail("eoin@myemail.co.uk");
    assertTrue(errchecker.emailValid());
    errchecker.setEmail("paul.murphy@mygit.ie");
    assertTrue(errchecker.emailValid());
    errchecker.setEmail("karen.greene@hello.ie");
    assertTrue(errchecker.emailValid());
    errchecker.setEmail("orla@yahoo.ie");
    assertTrue(errchecker.emailValid());

  }
}

基本上我只是实例化类而不是注入它。我还在我的 ErrorChecker 类中创建了一个方法,以便我可以设置上下文。然后我使用 MyApplication.getInst() 将 MyApplication 的静态实例传递给它,它扩展了 Application 类。我想知道这是用上下文创建我的 ErrorChecker 类的好方法,还是我应该尝试注入它。这将需要大量额外的样板代码,但可能看起来更干净。我想遵循最佳实践,所以如果有人能告诉我这种方法是否违反了最佳实践,或者可以建议在我的测试 ID 中创建 ErrorChecker 类的不同方法,真的很感激!

【问题讨论】:

    标签: android unit-testing robolectric dagger-2


    【解决方案1】:

    你真的需要在你的类 ErrorChecker 中传递上下文吗?我认为 ErrorChecker 应该只验证您的数据是否正确。如果数据不正确,您的视图应该有责任获取并显示消息。

    【讨论】:

    • 是的,你的权利。我在我的很多类中使用上下文来设置错误消息,通常在我的模型类中。我正在尝试使视图类成为“哑”视图,因此我尝试让它处理尽可能少的逻辑。因此我在我的模型中设置了错误(我从字符串资源中获得)。我可以更改代码,但是我在视图中处理非 UI 逻辑,这将违反 MVP。无论如何,这是我的想法,但我总是愿意接受建议。
    • 另外,我的测试与我的主要组件位于不同的包中,我的所有组件等都在其中。因此,我无法将 Mocks 注入到我的测试中,因为我无法在我的 Main 包中引用我的测试类。
    • 如何将上下文注入 ErrorChecker。你不能将它注入到 ErrorChecker 的构造函数中,这样你就可以在测试中使用模拟上下文。
    • 无法在我的组件中调用“void injection(TestErrorChecker errchecker)”,因为该组件位于主包中。所以我不能在我的主包中引用测试类,因为测试在测试包中。 .有点痛。我可以设置我的模块以返回一个模拟上下文,但我需要重组整个事情。那或者我可以尝试在我的测试包中扩展我的组件。看看这是否有效。反正一切都很有趣!
    猜你喜欢
    • 2019-10-05
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2011-06-29
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多