質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.58%

lombokの@Dataで生成されるgetter/setterがJUnitで見つからない

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,326

KazukiMaeda

score 8

質問

lombokの@Dataアノテーションを付与したModelを参照するControllerに対してテストを実行すると、lombokによって生成されているgetter/setterが見つからないというエラーが発生してしまいます。

Java初心者なので、そもそもJUnitの実行方法が異なるなどあるかもしれませんが、ご知見をいただきたく、よろしくおねがいします。

環境

Javaのバージョン

$ java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

IDEの種類とバージョン

IntelliJ IDEA 2019.1 (Community Edition)
Build #IC-191.6183.87, built on March 27, 2019
JRE: 1.8.0_202-release-1483-b39 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.12.6

ビルドツールの種類

$ gradle --version

------------------------------------------------------------
Gradle 5.3.1
------------------------------------------------------------

Build time:   2019-03-28 09:09:23 UTC
Revision:     f2fae6ba563cfb772c8bc35d31e43c59a5b620c3

Kotlin:       1.3.21
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          1.8.0_201 (Oracle Corporation 25.201-b09)
OS:           Mac OS X 10.12.6 x86_64

依存ライブラリ

plugins {
    id 'org.springframework.boot' version '2.1.4.RELEASE'
    id 'java'
    id 'war'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example.spring'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
    maven {
        url "https://plugins.gradle.org/m2/"
    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-validation'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'com.h2database:h2'
    annotationProcessor 'org.projectlombok:lombok'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.webjars:jquery:1.11.1'
    implementation 'org.webjars:bootstrap:3.3.7-1'
    implementation 'org.springframework.boot:spring-boot-starter-aop'
    implementation 'org.springframework:spring-aop'
    implementation 'org.springframework.security:spring-security-test'
    implementation 'org.aspectj:aspectjweaver'
    // implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity4'
    compile group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity4', version: '2.1.2.RELEASE'
}

コード

Model

package com.example.spring.login.domain.model;

import lombok.Data;

@Data
public class User {

    private String userId;
    private String password;
    private String userName;
    private int age;
    private boolean marriage;
    private String role;
}

Dao

package com.example.spring.login.domain.repository;

import java.util.List;
import org.springframework.dao.DataAccessException;
import com.example.spring.login.domain.model.User;


public interface UserDao {

    // Userテーブルの件数を取得
    public int count() throws DataAccessException

}

Controller

import com.example.spring.login.domain.model.User;

//(中略)

@Controller
public class HomeController {

    @GetMapping("/userDetail/{id:.+}")
    public String getUserDetail(@ModelAttribute SignupForm form, Model model,
            @PathVariable("id") String userId) {

        if (userId != null && userId.length() > 0) {
            User user = userService.selectOne(userId);

            form.setUserId(user.getUserId());
            form.setUserName(user.getUserName());
            form.setBirthday(user.getBirthday());
            form.setAge(user.getAge());
            form.setMarriage(user.isMarriage());

            // register model
            model.addAttribute("signupForm", form);
        }

        return "login/homeLayout";
    }
}

Test

package com.example.spring;

import static org.junit.Assert.*;

import com.example.spring.login.domain.repository.UserDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class UserDaoTest {

    @Autowired
    @Qualifier("UserDaoJdbcImpl")
    UserDao dao;

    // test for count method
    @Test
    public void countTest1() {
        assertEquals(dao.count(), 2);
    }
}

エラー

Error:(85, 32) java: シンボルを見つけられません
  シンボル:   メソッド getUserId()
  場所: タイプcom.example.spring.login.domain.model.Userの変数 user
Error:(86, 34) java: シンボルを見つけられません
  シンボル:   メソッド getUserName()
  場所: タイプcom.example.spring.login.domain.model.Userの変数 user

・・・(以下同様)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2019/04/15 08:39

    rubytomato
    コンパイルエラーよ。

    キャンセル

  • KazukiMaeda

    2019/04/17 18:12

    rubytomatoさん
    ありがとうございます。環境について追記しました。
    JUnit以外のコードについてはエラーが起きていないものと思います(bootRunを実行するとローカルの環境が問題なく立ち上がります。)

    キャンセル

  • rubytomato

    2019/04/17 22:08

    情報の追記ありがとうございました。
    お手数ですが更に3点ほど確認させてください。 1)ローカル環境でbootRunを実行すると動作確認できるということですが、ブラウザでアクセスすると期待する結果が得られるということで良いでしょうか? (つまり、適切なユーザIDを指定するとDBからデータが取得でき、それが画面に表示される) 2) 質問文に”Controllerに対してテストを実行すると ... エラーが発生してしまいます。”とありますが、実際に提示されているテストコードはUserDaoTestというDaoクラスに対してのテストコードのようです。エラーが起きているのは未提示のコントローラのテストコードでしょうか? それとも提示されているUserDaoTestというテストコードでしょうか? 3) Intellij IDEAのannotation processingが有効になっているか確認してください。確認方法は、メニューのFile -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors で、この画面の"Enable annotation processing"にチェックが入っているか. またlombokプラグインがインストールされているかもご確認ください。

    キャンセル

回答 1

0

compileOnly 'org.projectlombok:lombok'

コンパイルオンリーだからじゃないっすか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る