Johns redshirted in 2012 before serving as the team's placekick holder in 2013.[3] In Virginia's 2014 season opener against UCLA, Johns replaced Greyson Lambert, with the Cavaliers trailing 21–3. In relief of Lambert, he threw for 152 yards and two touchdowns, as Virginia lost 28–20.[4][5] In his first career start against Kent State, Johns threw for 227 yards and two touchdowns in addition to two interceptions.[6] He finished the 2014 season throwing for 1,109 yards, eight touchdowns, and five interceptions.[7] Entering the 2015 season, Johns was named the team's starting quarterback.[8] In 2015, he started all 12 games, throwing for 2,810 yards, 20 touchdowns, and 17 interceptions.[9] Despite being the incumbent starting quarterback, Johns competed for the starting job prior to the 2016 season, with East Carolina transfer, Kurt Benkert, being named the starter.[10][11] He played primarily as a reserve behind Benkert in 2016, before being named the starter against Georgia Tech.[12][13] Against Georgia Tech, he threw for 220 yards and a touchdown, while also throwing three interceptions.[14] Johns started the final game of his collegiate career against Virginia Tech.[15]
Johns finished his career throwing for 4,233 yards, 30 touchdowns, and 27 interceptions.[16]
After spending a season at his alma mater as a graduate assistant, Johns joined William & Mary as a tight ends coach.[17] After one season as the tight ends coach, he was promoted to the quarterbacks coach and passing game coordinator for the Tribe, positions he served until 2023. In December 2023, Johns joined Bronco Mendenhall's staff at New Mexico as the tight ends coach.[18]