Junit4: @Parameters ๋ฉ”์†Œ๋“œ๋Š” @ClassRule ์ดˆ๊ธฐํ™” ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2013๋…„ 05์›” 02์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: junit-team/junit4

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(_junit 4.11_ ์‚ฌ์šฉ).

    <strong i="6">@ClassRule</strong>
    public static TemporaryFolder tmp = new TemporaryFolder();
    ...
    <strong i="7">@Parameters</strong>
    public static Collection<Object[]> data() throws Exception {
        return java.util.Arrays.asList(new Object[][] {
            {0, tmp.getRoot().getPath()}
        });
    }

์ด๋กœ ์ธํ•ด initializationError ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

java.lang.IllegalStateException: the temporary folder has not yet been created
    at org.junit.rules.TemporaryFolder.getRoot(TemporaryFolder.java:127)

๋”ฐ๋ผ์„œ __@Parameters_ ๋ฉ”์„œ๋“œ๋Š” _ClassRule_ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„ ์ „์— ์‹คํ–‰๋˜์–ด ์œ„์™€ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์•ฝ๊ฐ„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

    protected static TemporaryFolder initStaticTemp() {
        try {
            return new TemporaryFolder() { { before(); } };
        } catch (Throwable t) {
            throw new RuntimeException(t);
        }
    }

    public static TemporaryFolder tmp = initStaticTemp();

    <strong i="6">@AfterClass</strong>
    public static cleanup() throws Exception {
        tmp.delete();
    }

์ž‘๋™ํ•˜์ง€๋งŒ ์ˆ˜๋™ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค ...

๋ชจ๋“  9 ๋Œ“๊ธ€

ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

    protected static TemporaryFolder initStaticTemp() {
        try {
            return new TemporaryFolder() { { before(); } };
        } catch (Throwable t) {
            throw new RuntimeException(t);
        }
    }

    public static TemporaryFolder tmp = initStaticTemp();

    <strong i="6">@AfterClass</strong>
    public static cleanup() throws Exception {
        tmp.delete();
    }

์ž‘๋™ํ•˜์ง€๋งŒ ์ˆ˜๋™ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค ...

+1

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ด์— ๋Œ€ํ•œ ์ฃผ์„์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<strong i="7">@Parameters</strong>
<strong i="8">@AfterClassRules</strong>
public Object[][] generateParameters() {
    // do stuff
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‘ ๋ณ€ํ˜•์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ์†์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋””์ž์ธ์ด ๋ฉ”์ธํ…Œ์ด๋„ˆ์—๊ฒŒ ๋ฐ›์•„๋“ค์—ฌ์ง„๋‹ค๋ฉด ๋‚˜๋Š” ์ด์— ๋Œ€ํ•œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ“๊ธ€์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์•Œ๋ฆผ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€ ๋Œ“๊ธ€์„ ์”๋‹ˆ๋‹ค.

์ด์ „ ์˜๊ฒฌ์—์„œ ์ œ์•ˆํ•œ ๋””์ž์ธ์ด ์œ ์ง€ ๊ด€๋ฆฌ์ž์—๊ฒŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—๋Š” ์ƒ๋‹นํžˆ ์–ด๋ ค์šด ์•„ํ‚คํ…์ฒ˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. JUnit์€ Eclipse์™€ ๊ฐ™์€ ์‹คํ–‰์ž๋“ค์—๊ฒŒ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ์—ด๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์•ฝ์†ํ•˜์ง€๋งŒ ์ด ๊ณ„ํš ๋‹จ๊ณ„์—์„œ ์†Œ๋น„๋˜๋Š” ๋ฆฌ์†Œ์Šค๋„ ์ตœ์†Œํ™”ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์ž„์‹œ ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์„œ๋ฒ„ ์‹œ์ž‘๊ณผ ๊ฐ™์ด ClassRules์— ํ‘œ์‹œ๋˜๋Š” ํ›จ์”ฌ ๋” ๊ณผ๊ฐํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ๋Œ€๋‹ต์€ ์ด๋ก ์—์„œ @DataPoints ์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @ParameterSet ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ์ •์  ํ•„๋“œ ๋˜๋Š” ์ •์  ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๋ฉ”์„œ๋“œ๋Š” ํ•จ๊ป˜ ๊ฒฐํ•ฉ๋˜์–ด ์ „์ฒด ๋งค๊ฐœ๋ณ€์ˆ˜ ์ง‘ํ•ฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ท€ํ•˜์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@ClassRule ๊ณต๊ฐœ ์ •์  TemporaryFolder tmp = new TemporaryFolder();
@ParameterSet ๊ณต๊ฐœ ์ •์  ๊ฐœ์ฒด[] ๋จผ์ € = ์ƒˆ ๊ฐœ์ฒด[] { 0 };
@ParameterSet ๊ณต๊ฐœ ์ •์  ๊ฐœ์ฒด[] ์ดˆ() {
return new Object[] { tmp.getRoot().getPath(); }
}

์—ฌ๊ธฐ์„œ ์š”์ ์€ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ "๋‘ ๋ฒˆ์งธ" ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

ํ , ์ง€๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋ฌธ์ œ๋Š” ์‹ค์ œ๋กœ ๋‚ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ๋” ๋งŽ์€ ๋ƒ„์ƒˆ๊ฐ€ ๋‚˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์›๊ฒฉ ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•˜๊ณ  ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ํ…Œ์ŠคํŠธ์—์„œ ์˜ˆ์ƒ ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์›๋ž˜ ๋ฌธ์ œ์— ์ง๋ฉดํ•œ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. CryptoAppExecReturnCodeTest.java

@dsaff ์ œ์•ˆ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์ธ์ƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์Œ์„ ๋ณ„๋„์˜ ๋ฐฐ์—ด๋กœ ๋ถ„ํ• ํ•˜๋ ค๋ฉด ์š”์†Œ์˜ ์œ„์น˜์— ํŠน๋ณ„ํ•œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(์กฐ๊ธˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ๋‚˜๋Š” _first_ ๋ฅผ ์ผ๋ถ€ ๋”๋ฏธ๋กœ ์ฑ„์šฐ๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(๋‹จ์ง€ ์š”์†Œ์˜ ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ). ๊ทธ๋ฆฌ๊ณ  _second_์—์„œ - ์Œ ์š”์†Œ๋ฅผ ์„œ๋กœ ์˜†์— ์œ ์ง€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

{ 0, tmp...getPath() },
{ 1, ... }

ํ…Œ์ŠคํŠธ ํšŸ์ˆ˜ ์™ธ์— ๋Ÿฌ๋„ˆ์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? (์˜ˆ - ์•„๋งˆ๋„ ํ…Œ์ŠคํŠธ ์ด๋ฆ„?)

@javornikolov , ๋ฐฉ๊ธˆ ๊ท€ํ•˜์˜ ์ดˆ๊ธฐ ๊ฒŒ์‹œ๋ฌผ์„ ์ž˜๋ชป ์ฝ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด ์‘๋‹ต์ด ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋กœ ์ฝ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‹ค์‹œ ์ฝ์—ˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๋‘ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์˜ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šคํ™”์ž…๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ œ์•ˆ๋œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<strong i="7">@ClassRule</strong> public static TemporaryFolder tmp = new TemporaryFolder();
<strong i="8">@ParameterSet</strong> public static Object[] only() {
return new Object[] { 0, tmp.getRoot().getPath(); }
}

๋‚ด ์˜๋„๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์ง€๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ํ˜ผ๋ž€์„ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

(์˜ค๋ž˜๋œ ๋ฒ„๊ทธ๋ฅผ ํ†ตํ•ด ์ง„ํ–‰)

์•„๋งˆ๋„ ์ด ๋ฌธ์ œ์˜ ์ด๋ฆ„์„ "์ด๋ก ์—์„œ @DataPoints ์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ™œ์„ฑํ™”"๋กœ ๋ฐ”๊ฟ”์•ผ ํ• ๊นŒ์š”?

(์˜ค๋ž˜๋œ ๋ฒ„๊ทธ๋ฅผ ํ†ตํ•ด ์ง„ํ–‰)

์•„๋งˆ๋„ ์ด ๋ฌธ์ œ์˜ ์ด๋ฆ„์„ "์ด๋ก ์—์„œ @DataPoints ์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ™œ์„ฑํ™”"๋กœ ๋ฐ”๊ฟ”์•ผ ํ• ๊นŒ์š”?

๋ฌธ์ œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์—์„œ Rule ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. @dsaff ๊ฐ€ ์ œ์•ˆํ•œ @ParameterSet ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‚˜์—๊ฒŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(ํ‰๊ฐ€๊ฐ€ ์›๋ž˜ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋Š” ์ˆœ์„œ๋กœ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •).
๊ทธ๋Ÿฌ๋‚˜ "@DataPoints์™€ ๊ฐ™์€ ๊ฒƒ"์ด ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ•˜๊ณ  ์›๋ž˜ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐœ์‚ฐํ•  ์œ„ํ—˜์ด ์—†๋‹ค๋ฉด: ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ DataPoints๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ก ๋ณด๋‹ค ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ๋Š” ํ›„์ž์˜ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ๋ณด๊ณ ๋˜์ง€ ์•Š๊ณ  ์ฒซ ๋ฒˆ์งธ ์‹คํŒจ๊ฐ€ ํ›„์† ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์‹คํ–‰์„ ์ค‘๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰