{"id":25776895,"url":"https://github.com/jqno/equalsverifier","last_synced_at":"2026-02-21T10:03:02.754Z","repository":{"id":29528672,"uuid":"33067279","full_name":"jqno/equalsverifier","owner":"jqno","description":"EqualsVerifier can be used in Java unit tests to verify whether the contract for the equals and hashCode methods is met.","archived":false,"fork":false,"pushed_at":"2026-02-16T19:45:21.000Z","size":9705,"stargazers_count":734,"open_issues_count":2,"forks_count":87,"subscribers_count":19,"default_branch":"main","last_synced_at":"2026-02-16T20:58:09.417Z","etag":null,"topics":["equals","java","testing"],"latest_commit_sha":null,"homepage":"http://www.jqno.nl/equalsverifier","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jqno.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2015-03-29T09:12:21.000Z","updated_at":"2026-02-16T17:34:38.000Z","dependencies_parsed_at":"2023-09-22T17:27:02.029Z","dependency_job_id":"b8bebe58-9afc-44aa-9d68-5f1ac760a220","html_url":"https://github.com/jqno/equalsverifier","commit_stats":null,"previous_names":[],"tags_count":199,"template":false,"template_full_name":null,"purl":"pkg:github/jqno/equalsverifier","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jqno%2Fequalsverifier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jqno%2Fequalsverifier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jqno%2Fequalsverifier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jqno%2Fequalsverifier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jqno","download_url":"https://codeload.github.com/jqno/equalsverifier/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jqno%2Fequalsverifier/sbom","scorecard":{"id":536348,"data":{"date":"2025-08-11","repo":{"name":"github.com/jqno/equalsverifier","commit":"2a91c7aa7260877973fa08e42f702325ab55bdff"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.6,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/15 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 10 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/pitest-comment.yml:1","Warn: no topLevel permission defined: .github/workflows/pitest.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":8,"reason":"binaries present in source code","details":["Warn: binary detected: equalsverifier-test/lib/nl/jqno/equalsverifier/equalsverifier-signedjar-test/0.1/equalsverifier-signedjar-test-0.1.jar:1","Warn: binary detected: equalsverifier-test/lib/nl/jqno/equalsverifier/equalsverifier-signedjar-test/0.2/equalsverifier-signedjar-test-0.2.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"CII-Best-Practices","score":2,"reason":"badge detected: InProgress","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:62: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/ci.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pitest-comment.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/pitest-comment.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pitest-comment.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/pitest-comment.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pitest.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/pitest.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pitest.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/pitest.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pitest.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/pitest.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pitest.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/pitest.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/jqno/equalsverifier/release.yml/main?enable=pin","Warn: containerImage not pinned by hash: docs/Dockerfile:1: pin your Docker image by updating jekyll/jekyll:4.0 to jekyll/jekyll:4.0@sha256:400b8d1569f118bca8a3a09a25f32803b00a55d1ea241feaf5f904d66ca9c625","Info:   0 out of  10 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yml:11"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 17 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T07:05:40.680Z","repository_id":29528672,"created_at":"2025-08-20T07:05:40.680Z","updated_at":"2025-08-20T07:05:40.680Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29679049,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T09:33:50.764Z","status":"ssl_error","status_checked_at":"2026-02-21T09:33:19.949Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["equals","java","testing"],"created_at":"2025-02-27T06:01:32.858Z","updated_at":"2026-02-21T10:03:02.749Z","avatar_url":"https://github.com/jqno.png","language":"Java","funding_links":[],"categories":["测试"],"sub_categories":[],"readme":"# EqualsVerifier\n\n[![Build Status](https://github.com/jqno/equalsverifier/actions/workflows/ci.yml/badge.svg)](https://github.com/jqno/equalsverifier/actions)\n[![Issue resolution](https://isitmaintained.com/badge/resolution/jqno/equalsverifier.svg)](https://isitmaintained.com/project/jqno/equalsverifier \"Average time to resolve an issue\")\n[![Apache License 2.0](https://img.shields.io/:license-Apache%20License%202.0-blue.svg?style=shield)](https://github.com/jqno/equalsverifier/blob/master/LICENSE.md)\n[![Maven Central](https://img.shields.io/maven-central/v/nl.jqno.equalsverifier/equalsverifier.svg?style=shield)](https://maven-badges.herokuapp.com/maven-central/nl.jqno.equalsverifier/equalsverifier/)\n[![Javadoc](https://javadoc.io/badge/nl.jqno.equalsverifier/equalsverifier.svg?color=blue)](https://javadoc.io/doc/nl.jqno.equalsverifier/equalsverifier)\n\n**EqualsVerifier** can be used in Java unit tests to verify whether the contract for the equals and hashCode methods in a class is met.\n\n# Getting Started\n\nEqualsVerifier's Maven coordinates are:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003enl.jqno.equalsverifier\u003c/groupId\u003e\n    \u003cartifactId\u003eequalsverifier\u003c/artifactId\u003e\n    \u003cversion\u003e4.4\u003c/version\u003e\n    \u003cscope\u003etest\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\n(Note that there's also a 'fat' jar with no transitive dependencies with artifactId `equalsverifier-nodep`.)\n\nNow you can write a test:\n\n```java\nimport nl.jqno.equalsverifier.*;\n\n@Test\npublic void equalsContract() {\n    EqualsVerifier.forClass(Foo.class).verify();\n}\n```\n\nEqualsVerifier is an opinionated library, which means that it can be quite strict. If you feel it's too much, you can make it more lenient:\n\n```java\nimport nl.jqno.equalsverifier.*;\n\n@Test\npublic void equalsContract() {\n    EqualsVerifier.simple().forClass(Foo.class).verify();\n}\n```\n\nThis way, EqualsVerifier will throw less errors at you. However, it's usually better to just fix the errors: EqualsVerifier throws them for a reason!\n\n## Prefer to watch a short video?\n\n[![EqualsVerifier getting started video by Tom Cools](video.png)](http://www.youtube.com/watch?v=ivRjf8yvVMk \"Video Title\")\n\n\u003csmall\u003eVideo by [Tom Cools](https://twitter.com/TCoolsIT)\u003c/small\u003e\n\n## Documentation\n\nFor more documentation, see:\n\n- The [code of conduct](CODE_OF_CONDUCT.md)\n- The [contribution guidelines](CONTRIBUTING.md) file\n- The [changelog](https://github.com/jqno/equalsverifier/blob/main/CHANGELOG.md)\n- The [project's website](https://jqno.nl/equalsverifier/)\n\n# A note on equality\n\nEqualsVerifier cares about bug-free equality, in Java and in real life. The place where a person happens to be born, the colour of their skin, their gender, or the person they happen to love, must not affect the way they are treated in life. If it does, that's a bug and it should throw an error.\n\nDon't allow bugs in your equality.\n\n🌈🧑🏻‍🤝‍🧑🏾🌍\n\n# Contribution\n\nPull requests are welcome! If you plan to open one, please also [register an issue](https://github.com/jqno/equalsverifier/issues/new) or [start a discussion](https://github.com/jqno/equalsverifier/discussions/new/choose), so we can discuss it first. It would be a shame to put in a lot of work on something that isn't a good fit for the project. Also, I can help you by giving pointers on where to find certain things.\n\n# Disclaimer\n\nCopyright 2009-2025 Jan Ouwens\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjqno%2Fequalsverifier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjqno%2Fequalsverifier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjqno%2Fequalsverifier/lists"}