【问题标题】:Is it possible to test a method in an Activity class?是否可以在 Activity 类中测试方法?
【发布时间】:2019-04-04 06:09:24
【问题描述】:

每个人都建议遵循 MVP 或 MVVM 模式以保持代码的可读性和可测试性。现在我有疑问了。现在我正在学习单元测试,并且正在以正式的方式编写代码。不使用任何模式。现在我的问题是,我可以像下面这样测试我的代码吗?

我的主要活动:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
    }

    public boolean testMethod(int value){
       return value== 5?true:false;
    }
}

我的单元测试类:

@RunWith(MockitoJUnitRunner.class)
public class ExampleUnitTest {
 MainActivity mainActivity = new MainActivity();
@Test
    public void testMethod(){
        boolean result = mainActivity.testMethod(5);
        assertEquals(true,result);
    }
}

在运行测试时,我没有收到任何错误或问题。那么这是正确的测试方法吗?或者如果我按照这种方法会发生什么?我也开始将我的代码迁移到 MVP 模式,但我想消除我的疑虑。请让我知道为什么我不应该遵循单元测试的正式编码。

【问题讨论】:

    标签: android unit-testing junit android-testing


    【解决方案1】:

    您的简单示例有效,因为被测代码实际上并不依赖于 Activity 类或任何 UI 状态。尝试为实际上依赖于 UI 状态的代码编写测试,例如

    public boolean verifyInput() {
        EditText edit = findViewById(R.id.edit1);
        return edit.getText().toString().startsWith("0");
    }
    

    如果你继续走这条路,你会注意到以下事情发生:

    • 你的Activity类会越来越大(神物反格局)。
    • 实际上依赖于 UI 状态(您的示例没有)的代码不能使用简单的单元测试来编写,需要进行 Android 插装测试。 IE。测试将无法再在您的主机上执行,但必须在设备上执行,并且需要设置 Activity 并将其置于正确状态。
    • 由于处理 UI 操作和状态所需的所有繁重工作的性质,仪器测试通常较慢并且可能不稳定。您将在测试运行中收到误报。
    • 测试方法将变得更加复杂,因为它们必须将 UI 带入正确的状态来测试逻辑。

    现在,所有这些都有一个简单的解决方案。将核心逻辑与 UI 逻辑分离。使处理 UI 的代码尽可能简单,并将(复杂的)核心逻辑移到单独的类中。突然之间,你有了第二个类,它的方法会让你更容易推理和编写测试。这 2 类也将匹配您的应用用户将能够采取的操作。

    一段时间后,您也会想要拆分第二类,因为您会注意到某些方法子集与另一个方法子集无关。因此,您不断进行模块化和精心设计,以使您作为开发人员更容易理解和使用代码。这是 MVP、MVVM 等模式变得派上用场的时候。

    请注意,我不建议您立即使用 MVVM 等模式。如果您刚刚开始学习编程、软件开发或 Android,那么做您所做的一切都很好。您将通过体验我们很多人已经遇到的这些“痛点”来学习,届时您将开始寻找改进以及为什么其他人建议使用特定模式或最佳实践。

    另外,看看low coupling and high cohesion 的含义以及它对开发人员的重要性。

    【讨论】:

    • 哇。现在我得到了一些观点,但对这个概念还不清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2012-05-20
    • 2022-01-08
    相关资源
    最近更新 更多