簡體   English   中英

訪問方法參數或方法的返回值

[英]Accessing Method Parameters or return value of a method

我想獲得JUnit測試的結果。 它保存在TestResult類中,該類是TestCase類的run方法的返回值,也是TestCase類的run方法的參數。

請參閱此鏈接了解JUnit的TestResult類和TestCase類。

http://junit.sourceforge.net/doc/cookstour/cookstour.htm

測試運行時,我可以訪問TestCase類。

我的問題是:方法運行結束時是否可以訪問該方法的參數,或者執行該方法后是否可以獲得方法的返回值?

我正在為我的論文進行方面編程。 在那里,我可以訪問TestCase類。 執行測試用例方法時。 無論測試通過還是失敗,我都希望得到其結果。 這樣我就可以使用這些信息。 如何以編程方式獲取測試結果?

這是示例代碼:

    pointcut allMethodsRun() : execution(* *.*(..));
    pointcut testClasses() : within(junit.framework.TestCase+);


 after() :  testClasses() && allMethodsRun() {   
     System.out.println(((TestCase) thisJoinPoint.getThis()).run()  );        

在這里,我可以訪問TestCase類,但是在執行test方法之后如何獲取測試結果。 有任何想法或問題嗎?

伊爾克

如果您正在執行上述測試,則​​檢測成功/失敗非常簡單。 如果.run()拋出AssertionError,則測試失敗;如果run()拋出其他錯誤,則測試出錯;否則,測試成功。

Andrew絕對是正確的,但是對於它的價值,您想看到一種AOP解決方案,所以我在AspectJ中為您准備了一個。 但是我不喜歡舊的JUnit樣式,因此我使用@Test注釋而不是從TestCase繼承來准備JUnit 4測試用例。 我認為您應該熟悉JUnit 4,因為它已經存在了很長時間,並且已經成為當今的標准。

被測類(非常瑣碎):

package de.scrum_master.app;

public class Calculator {
    public static int add(int summand1, int summand2) {
        return summand1 + summand2;
    }

    public static int subtract(int minuend, int subtrahend) {
        return minuend - subtrahend;
    }

    public static int multiply(int factor1, int factor2) {
        return factor1 * factor2;
    }

    public static int divide(int dividend, int divisor) {
        return dividend / divisor;
    }
}

具有一個失敗的斷言和一個產生計划外的運行時錯誤的測試的JUnit 4測試:

package de.scrum_master.app;

import static org.junit.Assert.*;
import org.junit.Test;

public class CalculatorTest {
    @Test
    public void testAdd() {
        assertEquals(33, Calculator.add(11, 22));
        assertEquals(12, Calculator.add( 4,  8));
        assertEquals(11, Calculator.add(11,  0));
    }

    @Test
    public void testSubtract() {
        assertEquals(33, Calculator.subtract(44, 11));
        assertEquals(12, Calculator.subtract(12,  0));
        assertEquals(11, Calculator.subtract(19,  8));
    }

    @Test
    public void testMultiply() {
        assertEquals(33, Calculator.multiply( 3, 11));
        assertEquals(12, Calculator.multiply( 4,  3));
        // This assertion should fail
        assertEquals(11, Calculator.subtract(10,  5));
    }

    @Test
    public void testDivide() {
        assertEquals(33, Calculator.divide(99, 3));
        assertEquals(12, Calculator.divide(51, 4));
        // This call should cause an exception
        assertEquals(11, Calculator.divide(11, 0));
    }
}

方面捕獲成功和失敗的測試:

package de.scrum_master.aspect;

import org.junit.Test;

public aspect TestResultInterceptor {
    pointcut testMethods() :
        execution(@Test public void *(..));

    after() returning : testMethods() {
        System.out.println(
            "Test OK: " +
            thisJoinPointStaticPart.getSignature()
        );
    }

    after() throwing (Throwable throwable) : testMethods() {
        System.out.println(
            (throwable instanceof AssertionError ? "Test failed: " : "Error during test: ") +
            thisJoinPointStaticPart.getSignature()
        );
        System.out.println("  " + throwable);
    }
}

運行JUnit測試時的控制台日志:

Test OK: void de.scrum_master.app.CalculatorTest.testAdd()
Test OK: void de.scrum_master.app.CalculatorTest.testSubtract()
Error during test: void de.scrum_master.app.CalculatorTest.testDivide()
  java.lang.ArithmeticException: / by zero
Test failed: void de.scrum_master.app.CalculatorTest.testMultiply()
  java.lang.AssertionError: expected:<11> but was:<5>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM